第3篇:手写一个饮品制作模板(附代码)
摘要:泡茶和冲咖啡的代码怎么写才能不重复?本文手把手教你用模板方法模式实现一个饮品制作模板,包含抽象父类、茶和咖啡两个子类、钩子控制加调料,并附完整运行结果,一看就懂。泡茶和冲咖啡的代码怎么写才能不重复?本文手把手教你用模板方法模式实现一个饮品制作模板,包含抽象父类、茶和咖啡两个子类、钩子控制加调料,并附完整运行结果,一看就懂。
本文是《Java 23 种设计模式:从踩坑到精通》模板方法模式长文的扩充短文第3篇,帮助你碎片化掌握核心知识点。
前两篇我们理解了模板方法模式的思想和结构,今天直接上手写代码,用一杯茶和一杯咖啡验证"固定骨架、填充细节"的精髓。
抽象父类:定义骨架
java
public abstract class BeverageMaker {
// 模板方法,final 防止子类篡改流程
public final void makeBeverage() {
boilWater(); // 通用步骤
brew(); // 可变步骤(子类实现)
pourInCup(); // 通用步骤
if (wantCondiments()) { // 钩子方法
addCondiments(); // 可变步骤(子类实现)
}
}
private void boilWater() {
System.out.println("把水烧到 100°C");
}
private void pourInCup() {
System.out.println("倒入杯中");
}
protected abstract void brew();
protected abstract void addCondiments();
// 钩子方法:默认加调料
protected boolean wantCondiments() {
return true;
}
}
具体子类:茶
java
public class TeaMaker extends BeverageMaker {
@Override
protected void brew() {
System.out.println("用热水浸泡茶叶");
}
@Override
protected void addCondiments() {
System.out.println("加柠檬");
}
}
具体子类:咖啡(带钩子控制)
java
public class CoffeeMaker extends BeverageMaker {
@Override
protected void brew() {
System.out.println("用热水冲泡咖啡粉");
}
@Override
protected void addCondiments() {
System.out.println("加糖和牛奶");
}
// 重写钩子:喝黑咖啡不加料
@Override
protected boolean wantCondiments() {
return false;
}
}
客户端测试
java
System.out.println("=== 制作茶 ===");
BeverageMaker tea = new TeaMaker();
tea.makeBeverage();
System.out.println("\n=== 制作咖啡 ===");
BeverageMaker coffee = new CoffeeMaker();
coffee.makeBeverage();
运行结果:
java
=== 制作茶 ===
把水烧到 100°C
用热水浸泡茶叶
倒入杯中
加柠檬
=== 制作咖啡 ===
把水烧到 100°C
用热水冲泡咖啡粉
倒入杯中
注意:咖啡的输出中没有"加糖和牛奶",因为 wantCondiments()返回 false,跳过了加调料步骤。
一句话总结:父类写好流程,子类只管填空,钩子让你灵活开关。
📖 完整长文入口:本文是模板方法模式扩充系列的第3篇。如果你想一次性阅读完整内容(含UML、完整代码、框架应用、面试追问等),请查看原长文:
👉 《Java 23 种设计模式:从踩坑到精通 | 模板方法模式》
🔗 系列导航:
- 上一篇:模板方法模式核心:好莱坞原则
- 下一篇:模板方法 vs 策略模式,面试怎么选?
- 返回扩充系列目录 🔥 订阅本专栏,不错过每一篇
- 原系列总目录🔥 订阅本专栏,不错过每一篇