设计模式之模板方法模式

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

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

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

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

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站:

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

相关推荐
我命由我1234516 分钟前
5-2.Python 编码进阶 - 字符串进阶(拼接、普通格式化、普通格式化数字精度控制、快速格式化、遍历、常用方法)
java·开发语言·后端·python·学习·java-ee·学习方法
博风22 分钟前
17、设计模式应用举例:单件模式:多线程争冠军
设计模式
Pniubi8 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko79 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师9 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.9 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼10 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说11 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
紧跟先前的步伐13 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
高晶13 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员