设计模式第八集——模板方法模式
模板方法模式:在一个方法中定义一个算法的骨架,将一些步骤延迟到子类中。使用模板方法可以让子类在不改变算法结构的情况下重新定义算法中的某些步骤。
举个例子:在咖啡馆中提供咖啡和茶两种。
咖啡冲泡法:把水煮沸->用沸水冲泡咖啡->把咖啡倒进杯子->加糖和牛奶
茶的冲泡法:把水煮沸->用沸水浸泡茶叶->把茶倒进杯子->加柠檬
从过程中可以看出来,无论是茶和咖啡都遵循着煮水->泡->倒进杯子->加调料这四个步骤,所以把整体抽象出来作为模板。具体茶和咖啡的不同可由子类具体实现。
1 package com.test; 2 3 public abstract class Caffeinebeverage { 4 void prepareRecipe(){ 5 boilWater(); 6 brew(); 7 pourInCup(); 8 if(customerWantsCondiments()){ 9 addCondiments(); 10 } 11 } 12 13 abstract void addCondiments(); 14 15 boolean customerWantsCondiments() { 16 // TODO Auto-generated method stub 17 return true; 18 } 19 20 void pourInCup() { 21 System.out.println("Pouring in Cup"); 22 23 } 24 25 abstract void brew(); 26 27 void boilWater() { 28 System.out.println("Booling water"); 29 } 30 31 }
在代码中prepareRecipe()是我们规定好的算法结构,无论茶还是咖啡都要按照这个结构进行。其中brew()和addCodiments()咖啡和茶处理会有所不同,所以把它们写为抽象方法在具体子类中进行覆盖。在这里customerWantsCondiments()是一个钩子方法,这里默认返回为true(就是所有顾客都要加调料)
钩子方法:在抽象类中不做事,或者制作默认的事情,子类可以选择要不要去覆盖它。
什么时候用钩子方法呢?当算法的这个部分是可选的,用钩子方法
模板模式和策略模式的区别:
模板模式是定义一个算法的大纲,让子类定义具体步骤的内容。策略模式,定义一个算法家族,并且这些算法可以互换。每个算法都被封装起来,所以客户可以使用不同的算法。
模板方法用的是继承,策略方法用的是组合。
注意:工厂方法是模板方法的一个特殊版本