第3篇:手写一个饮品制作模板(附代码)

第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 种设计模式:从踩坑到精通 | 模板方法模式》

🔗 系列导航:

相关推荐
smallyoung2 小时前
告别N+1:Spring Boot 一键数据翻译框架体系
java·后端·架构
Bazingga3 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
SL_staff5 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3275 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar5 小时前
Java封装、继承、多态
java·开发语言
ly76895 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠5 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
高晶6 小时前
CANopen 在 BMS 系统中的 C 语言实战指南
设计模式·程序员
奇牙coding6 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
小羊没烦恼!6 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp