模板方法模式定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法是的子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
- 模板方法定义了算法的实现步骤,把这些步骤放在子类中实现;
- 模板方法为我们提供了代码复用的重要技术;
- 模板方法的抽象类可以定义具体方法;
- 抽象方法由子类实现;
- 钩子方法在抽闲类中不做任何事,或者只做默认的事,子类可以选择要不要覆盖钩子方法;
- 为了防止子类改变模板方法,可以将模板方法为final;
- 策略模式和模板方法模式都是封装算法,一个用组合方式,后一个用继承方式;
定义模板抽象类,其中prepare方法定义了模板的执行顺序,子类可以实现各自的方法,但是必须使用prepare模板方法执行;
public abstract class CoffeineBeverage { /** * 定义各个方法的执行顺序 */ final void prepare() { boilWater(); brew(); pourInCup(); addCondiments(); } /** *把水煮沸 */ public abstract void boilWater(); /** * 用水冲 */ public abstract void brew(); /** *把饮料倒入杯中 */ public void pourInCup() { System.out.println("把饮料倒入杯中"); }; /** *加适当调料 */ public abstract void addCondiments(); }
茶类,继承CoffeineBeverage类,实现prepare模板方法中定义的具体步骤方法;
public class Tea extends CoffeineBeverage { @Override public void boilWater() { System.out.println("Tea 把水煮沸"); } @Override public void brew() { System.out.println("Tea 用水冲"); } @Override public void addCondiments() { System.out.println("Tea 加适当调料"); } }
咖啡类,继承CoffeineBeverage类,实现prepare模板方法中定义的具体步骤方法;
public class Coffee extends CoffeineBeverage { @Override public void boilWater() { System.out.println("Coffee 把水煮沸"); } @Override public void brew() { System.out.println("Coffee 用水冲"); } @Override public void addCondiments() { System.out.println("Coffee 加适当调料"); } }
测试类:
public class Test { public static void main(String[] args){ CoffeineBeverage tea = new Tea(); tea.prepare(); CoffeineBeverage coffee = new Coffee(); coffee.prepare(); } }
执行结果:
Tea 把水煮沸
Tea 用水冲
把饮料倒入杯中
Tea 加适当调料
Coffee 把水煮沸
Coffee 用水冲
把饮料倒入杯中
Coffee 加适当调料