设计模式之模板方法模式

从这节开始,我们进入行为型模式的学习。行为型模式第一个模式就是模板方法模式。

概念:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

只有两个角色,抽象模板和具体模板类。抽象模板负责定义模板方法和其他方法,并在模板方法中以一定顺序调用其他方法。其他方法可以是抽象方法,通常需要子类进行重写(就是所谓的延迟到子类中实现),也可以是具体方法,一般是通用的步骤。

用一个咖啡机的例子帮助大家理解:

java 复制代码
public abstract class CoffeeMaker {
    // 模板方法:制作咖啡的过程
    public final void makeCoffee() {
        grindBeans();
        brew();
        pourIntoCup();
        addCondiments();
    }
    // 基本操作:磨豆子,由子类实现
    abstract void grindBeans();
    // 基本操作:冲泡咖啡,由子类实现
    abstract void brew();
    // 具体操作:将咖啡倒入杯中,这是固定步骤,不需要子类覆盖
    void pourIntoCup() {
        System.out.println("将咖啡倒入杯中");
    }
    // 基本操作:添加调料,由子类实现
    abstract void addCondiments();
}

class EspressoMachine extends CoffeeMaker {
    @Override
    void grindBeans() {
        System.out.println("研磨咖啡豆,磨成意式咖啡粉");
    }
    @Override
    void brew() {
        System.out.println("调制意式浓缩咖啡");
    }
    @Override
    void addCondiments() {
        System.out.println("添加意式浓缩咖啡特有原料");
    }
}

public class LatteMachine extends CoffeeMaker {
    @Override
    void grindBeans() {
        System.out.println("研磨咖啡豆,磨成拿铁咖啡粉");
    }
    @Override
    void brew() {
        System.out.println("调制拿铁咖啡");
    }
    @Override
    void addCondiments() {
        System.out.println("加入牛奶等原料");
    }
}

public class Demo {
    public static void main(String[] args) {
        CoffeeMaker espressoMaker = new EspressoMachine();
        CoffeeMaker latteMaker = new LatteMachine();
        System.out.println("制作意式浓缩咖啡 : ");
        espressoMaker.makeCoffee();
        System.out.println("*********************************分割线****************************************");
        System.out.println("制作拿铁 : ");
        latteMaker.makeCoffee();
    }
}

如果大家需要视频版本的讲解,欢迎关注我的B站:

十四、设计模式之模板方法模式

相关推荐
用户2986985301435 分钟前
Java 实现 Word 文档文本与图片提取的方法
java·后端
SimonKing2 小时前
铁子,IntelliJ IDEA 2026.1.3来了,升不升?
java·后端·程序员
咖啡八杯12 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
用户1285261160220 小时前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java
Linsk20 小时前
组件 = 模板 + 业务逻辑
java·前端·vue.js
星沉远浦21 小时前
用Gemini高效解决Java代码报错难以定位的问题
java
用户298698530141 天前
Word 文档字符级格式化:Java 实现方案详解
java·后端
笨鸟飞不快1 天前
从单个服务到集群:一次完整的性能排查复盘
java·前端
荣码1 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python