类图
理解:
1)两个子类同时实现一个抽象父类,父类中定义模板流程方法,子类实例进行调用执行
2)钩子是个很巧妙的设计,子类可以实现,也可以不实现,不实现的情况下抽象父类中有默认值
代码
//1、父类
public abstract class Beverage {
protected final void make() {
this.boilWater();
this.brew();
this.pourInCup();
if (hook()) {
this.addCondiments();
}
}
//第一步,烧水
final void boilWater() {
System.out.println("1.烧水");
}
//第二步,冲泡
abstract void brew();
//第三步,将(***)倒入杯子
final void pourInCup() {
System.out.println("3.倒入杯子");
}
//加调味
abstract void addCondiments();
//钩子方法
protected boolean hook() {
return false;
}
}
//2、子类:茶
public class Tea extends Beverage {
@Override
void brew() {
System.out.println("2.冲泡茶");
}
@Override
void addCondiments() {
System.out.println("4.加柠檬");
}
}
//3、子类:咖啡
public class Coffeee extends Beverage {
@Override
void brew() {
System.out.println("2.冲泡咖啡");
}
@Override
void addCondiments() {
System.out.println("4.加糖");
}
@Override
protected boolean hook() {
//通过条件判断,返回true/false
return true;
}
}
//4、应用
public class Test {
public static void main(String[] args) {
Tea tea = new Tea();
tea.make();
Coffeee coffeee = new Coffeee();
coffeee.make();
}
}