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

🔗 系列导航

相关推荐
极客先躯10 分钟前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
xqqxqxxq39 分钟前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记
wang09071 小时前
自己动手写一个spring之aop_1
java·后端·spring
国科安芯2 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
deng12042 小时前
【Thread类的用法(1)-- Thread类的基本用法】
java·java-ee
suconnect2 小时前
Spring Boot接入企业RAG:文档切分、向量检索、权限过滤和答案溯源
java·spring boot·后端
weixin_BYSJ19872 小时前
springboot校园自习室管理小程序---附源码32142
java·javascript·spring boot·python·django·flask·php
ClickHouseDB3 小时前
ClickHouse托管Postgres:OLTP+OLAP,新能力解锁最佳数据平台
java·前端·数据库
霸道流氓气质3 小时前
Java中集成Smile 技术教程:从入门到工程实践
java·开发语言
wuqingshun3141593 小时前
MyBatis 中#()和$()的区别是什么?
java