在整理模板方法之前,先来说点废话吧。除了记录学习总结,也来记录一下生活吧。
我们公司的老板在北京,老板也会因为项目来公司,不过不是天天来。公司有个同事,只要老板不在就天天迟到,而且一天比一天晚,经常来了公司没多久,午饭的外卖就送到公司了。前几天,外卖竟然比他还来的早(外卖11点半送到的),公司一个不怎么说废话的同事说了一句“兵马未动,粮草先行”。其他同事都觉得他说的很是到位。
模板方法模式的定义
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
我的理解是,在一个较为通用的流程中或步骤中,只有具体的某个步骤可能是不相同的。比如,实现一个“我下面给你吃……”,首先把水倒入锅里,第二步下面,最后把面从锅里捞出来。这个流程是固定的,但是可能第二部在南方和北方就不一样了,比如北方人吃刀削面,所以下的是刀削面,南方人吃的是热干面,所以第二步下的是热干面。也就是具体的面不一样了,而整个的流程算法是相同的。
代码示例
1 public class TemplateMethod { 2 public static void main(String[] args) { 3 System.out.println("南方人下面给你吃"); 4 NanFang nf = new NanFang(); 5 nf.zhuMian();; 6 7 System.out.println("++++++++++++++++++++++++"); 8 9 System.out.println("北方人下面给你吃"); 10 BeiFang bf = new BeiFang(); 11 bf.zhuMian(); 12 } 13 } 14 15 abstract class Mian { 16 17 public void zhuMian() { 18 System.out.println("把水倒入锅里"); 19 xiaMian(); 20 System.out.println("把面从锅里捞出来"); 21 System.out.println("面给你吃"); 22 } 23 24 public abstract void xiaMian(); 25 } 26 27 class NanFang extends Mian { 28 public void xiaMian() { 29 System.out.println("热干面"); 30 } 31 } 32 33 class BeiFang extends Mian { 34 public void xiaMian() { 35 System.out.println("刀削面"); 36 } 37 }
编译运行如下图所示:
总结
总结来自于《大话设计模式》一书中第十章“考题抄错会做也白搭——模板方法模式”。
1、既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重复;
2、当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理;
3、模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势;
4、当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。