模板方法:
1.定义了算法的步骤,可以把公共部分实现了,与具体子类相关的步骤如何实现延迟到子类由子类决定如何实现;
2.模板方法为我们提供了一种代码复用的重要技巧(公共方法)
3.模板方法的抽象类可以定义具体方法、抽象方法和钩子
4.抽象方法由子类来实现
5.钩子是一种方法,他在抽象类中不做事,或者只做默认的事儿,子类可以选择要不要屈服该它;
6.为了防止子类改变模板算法中部分方法的算法,可以将模板中对应方法声明为final
7.策略模式和模板方法模式都封装算法,但是他们有本质区别
策略模式用继承
模板方法用组合
2.模式的组成
抽象类(AbstractClass): 定义抽象的原语操作(primitive operation) ,具体的子类将重定义它们以实现一个算法, 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义
具体子类 (ConcreteClass): 实现原语操作以完成算法中与特定子类相关的步骤。
4.示例
一个人每天起床步骤
刷牙,洗脸,上班
刷牙,洗脸都一样,但是上班有走路,骑车,地铁
show code
public abstract class Template { public final void templateMethod(){ this.brush(); this.washFace(); this.gotoWork(); if(this.hook()){ this.other(); } } public void brush(){ System.out.println("brush"); } public void washFace(){ System.out.println("washFace"); } public abstract void gotoWork(); public abstract void other(); // 钩子函数 public boolean hook(){ return true; } }
ublic class PersonWithWalk extends Template { public void gotoWork(){ System.out.println("goto work by walk"); } @Override public void other() { System.out.println("arrive company"); } }
public class PersonWithBike extends Template { @Override public void gotoWork() { System.out.println("goto walk by bike"); } @Override public void other() { System.out.println("arrive company"); } }
public class PersonWithSubTrain extends Template { @Override public void gotoWork() { System.out.println("go to work by train"); } @Override public void other() { System.out.println("arrive company"); } }
public class Person { public static void main(String[] args) throws Exception { PersonWithBike template = new PersonWithBike(); // walk template.templateMethod(); } }