- 模板模式方法的具体实现要素
基本方法:所有实现类共有的方法
private void pourInCup() {
System.out.println("将饮料倒入杯中");
}
private void boilWater() {
System.out.println("将水煮沸");
}
抽象方法:具体实现细节需要延迟到子类来实现
可选的钩子:具体的子类可以自行决定是否挂钩以及如何挂钩
protected boolean isCustomerWantsCondiments() {
return true;
}
if(isCustomerWantsCondiments()) {
addCondiments();
}
Template方法(final):将所有的基本方法、抽象方法、钩子方法按照设计逻辑混总成一个final方法
public final void prepareBeverageTemplate() {
boilWater();
brew();
pourInCup();
if(isCustomerWantsCondiments()) {
addCondiments();
}
}
具体子类:实现基类中的抽象方法,覆盖钩子方法
public class Tea extends RefreshBeverage {
@Override
protected void addCondiments() {
System.out.println("加入柠檬");
}
@Override
protected void brew() {
System.out.println("用80度的热水浸泡茶叶5分钟");
}
@Override
protected boolean isCustomerWantsCondiments() {
return false;
}
}
- 模板方法:准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性。最后将方法汇总构成一个不可改变的模板方法
- 模板方法模式的使用场景:
算法或操作遵循相似的逻辑(例如茶和咖啡有相似的配制过程);
重构时,把相同的代码抽取到父类中;
重要、复杂的算法,核心的算法设计为模板算法。
- 模板方法模式的优点:封装性好、复用性好、屏蔽细节、便于维护
缺点:继承(java是单继承,只能继承一个父类,不能继承多个父类)