设计模式之模板方法模式

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

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

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

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

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

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

相关推荐
云烟成雨TD5 小时前
Spring AI Alibaba 1.x 系列【69】Token 用量统计
java·人工智能·spring
JAVA9655 小时前
JAVA面试-并发篇 03-使用synchronized doublecheck实现单例有什么坑
java·单例模式·面试
在繁华处5 小时前
Java从零到熟练(四):面向对象基础
java·开发语言
小江的记录本6 小时前
【JVM虚拟机】堆内存分代模型:年轻代(Eden+Survivor)、老年代、元空间Metaspace(附《思维导图》+《面试高频考点清单》)
java·前端·jvm·后端·python·spring·面试
在繁华处6 小时前
Java从零到熟练(三):流程控制
java·开发语言·python
唐青枫7 小时前
Java Optional 实战指南:优雅处理空值与链式转换
java
一起学开源7 小时前
一文读懂 ReAct 范式:让 AI Agent 真正学会“思考+行动“
java·javascript·react.js·ecmascript·react·alibaba·智能体开发
逍遥德8 小时前
MQTT教程详解-04.SpringBoot集成MQTT(告别手动控制)
java·spring boot·物联网·中间件·iot·iotdb
语戚8 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
我命由我123459 小时前
Android 开发问题:MlKitException: An internal error occurred during initialization.
android·java·java-ee·android jetpack·android-studio·androidx·android runtime