模板方法模式定义一个操作中的算法骨架,将一些步骤延迟到子类中。准备一个抽模板,实现部分逻辑,再声明一些对于子类需要不同实现的公用抽象方法。
场景:对于多个业务,它们的业务中有很多功能是相似的,有部分功能需要独自实现。这样我们就可以使用模板方法模式,将功能打散,抽取出更小的功能块,减小重复代码。
角色 |
作用 |
---|---|
抽象模板 |
定义子类需要实现的不同功能块,以及子类共用的功能块 |
具体模板 |
实现各自不同的功能块 |
在泡咖啡和泡柠檬绿茶的时候,它们有部分功能是相同的-烧水,倒入杯子。而加的主料和调料是不同的。
热饮
有一个子类无法覆盖的方法prepareRecipe(),用于冲泡饮料的功能
public abstract class Beverage {
final void prepareRecipe() {
// final 表示希望子类不能覆盖此方法
boilWater();
brew();
pourInCup();
addCondiments();
}
// 冲泡内容和添加的配料都由子类来实现
abstract void brew();
abstract void addCondiments();
private void pourInCup() {
System.out.println("将热饮倒入杯子");
}
private void boilWater() {
System.out.println("烧水");
}
}
咖啡
// 咖啡的冲泡
public class Coffee extends Beverage {
@Override
void brew() {
System.out.println("添加咖啡");
}
@Override
void addCondiments() {
System.out.println("添加方糖");
}
}
柠檬绿茶
// 柠檬绿茶冲泡
public class Tea extends Beverage {
@Override
protected void brew() {
System.out.println("放入茶叶");
}
@Override
protected void addCondiments() {
System.out.println("加入柠檬片");
}
}
冲泡饮料
public static void main(String[] args) {
System.out.println("泡咖啡");
Beverage coffee = new Coffee();
coffee.prepareRecipe();
System.out.println("泡柠檬绿茶");
Beverage tea = new Tea();
tea.prepareRecipe();
}
输出
泡咖啡
烧水
添加咖啡
将热饮倒入杯子
添加方糖
泡柠檬绿茶
烧水
放入茶叶
将热饮倒入杯子
加入柠檬片
提枪策马乘胜追击04-21 20:01
代码小兵87207-15 12:10
杨晶珍05-11 14:54
杨晶珍05-12 17:30