一、说明/设计原则
- 1、说明:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法将使得子类可以再不改变算法结构的情况下,
重新定义算法中的某些步骤
二、实例
2-1、抽象父类
package com.tjw.headFirst.eight.one;
/**
* @program: HeadFirst
* @description:
* @author: jiawen.tang
**/
public abstract class CaffeineBeverage {
/**
* 1、算法模板方法
* 冲泡对象的方法
* 2、这个方法用final,因为我们不打算子类覆盖这个方法
* 并且泛化了brew和addCondiment方法
* 3、这个类主导一切,将代码的复用性最大化了
* 4、算法比较集中,容易修改
* 5、提供了一个框架,可以让新的饮料插入进来
* 6、子类可以在需要改变的方法里面随意修改逻辑
* 7、
*/
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()){
addCondiments();
}
}
/**
* 烧开水
* 基类就可以完成的公共方法
*/
void boilWater() {
System.out.println("烧开水");
}
/**
* 冲泡法--泛化了
* 浸泡茶或者磨咖啡,材料处理
* abstract需要子类处理的方法
*/
abstract void brew();
/**
* 倒入杯中
*/
void pourInCup() {
System.out.println("倒入杯中");
}
/**
* 加辅料-泛化了
* 子类必须自己实现的方法
*/
abstract void addCondiments();
/**
* 钩子,子类可以实现,相当于勾选框
* @return
*/
boolean customerWantsCondiments(){
return true;
}
}
2-2、具体子类
package com.tjw.headFirst.eight.one;
/**
* @program: HeadFirst
* @description:咖啡
* @author: jiawen.tang
**/
public class Coffee extends CaffeineBeverage {
@Override
public void brew() {
System.out.println("磨咖啡");
}
@Override
public void addCondiments() {
System.out.println("加糖和加奶");
}
/**
* 钩子函数,单选框
* @return
*/
@Override
boolean customerWantsCondiments() {
return false;
}
}
package com.tjw.headFirst.eight.one;
/**
* @program: HeadFirst
* @description:茶
* @author: jiawen.tang
**/
public class Tea extends CaffeineBeverage{
@Override
public void brew() {
System.out.println("从茶叶袋里面拿茶并浸泡泡茶");
}
@Override
public void addCondiments() {
System.out.println("加柠檬");
}
@Override
boolean customerWantsCondiments() {
return super.customerWantsCondiments();
}
}
三、总结
* 1、公用的方法提取到抽象父类实现,子类只需要实现自己定制化的方法就行了。
* 2、钩子方法很有意思,默认是不开启,当有些方法需要打开时就可以使用钩子方式打开。
参考资料 Java设计模式