定义:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
(算法的骨架,可以理解为你根据需求设计出来的业务流程; 特定的步骤就是指那些可能在内容上存在变数的环节)
结构图:
-
AbstractClass是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
-
ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
优点:
-
提高代码复用性
将相同部分的代码放在抽象的父类中
-
提高了拓展性
将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为
-
实现了反向控制
通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 ,符合“开闭原则
模板方法模式是通过把不变行为搬移到父类,去除子类中的重复代码类体现它的优势。(当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。)
可以看出来,模板方法模式也是为了巧妙解决变化对系统带来的影响而设计的。使用模板方法使系统扩展性增强,最小化了变化对系统的影响。
缺点:
-
类数目的增加,每一个抽象类都需要一个子类来实现,这样导致类的个数增加;
-
类数量的增加,间接地增加了系统实现的复杂度;
-
继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍;
适用场景:
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。