设计模式复习,代码是最好的说明。
定义:模版方法模式定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特点步骤,属于行为类模式。
UML:
代码:这里放一个泡茶的例子
/*
为子类提供一个算法框架
*/
public abstract class RefreshBeverage {
public final void prepareBeverageTemplate(){
//1.烧水
boilWater();
//2.泡制
brew();
//3.倒入杯中
pourInCup();
//4.加调料,是否需要由具体子类决定
if (isCustomerWantAddCondiments()) {
addCondiments();
}
}
//钩子函数,提供一个默认或空的实现,子类决定是否挂钩
protected boolean isCustomerWantAddCondiments(){
return true;
}
//抽象的基本方法
protected abstract void addCondiments();
//抽象的基本方法
protected abstract void brew();
//基本方法
private void pourInCup() {
System.out.printf("倒入杯中");
}
//基本方法
private void boilWater() {
System.out.printf("烧水");
}
}
public class Tea extends RefreshBeverage {
@Override
protected void addCondiments() {
System.out.printf("加入柠檬");
}
@Override
protected void brew() {
System.out.printf("80度水泡制5分钟");
}
//泡茶,选择不加调料,不挂载钩子函数
@Override
protected boolean isCustomerWantAddCondiments() {
return false;
}
}
public class Coffee extends RefreshBeverage {
@Override
protected void addCondiments() {
System.out.printf("加少许白糖");
}
@Override
protected void brew() {
System.out.printf("70度热水10分钟");
}
//coffee通常加糖,所以选择挂载钩子函数
@Override
protected boolean isCustomerWantAddCondiments() {
return super.isCustomerWantAddCondiments();
}
}
如有错误,欢迎纠正!