设计模式之模板方法模式

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

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

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

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

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

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

相关推荐
AC赳赳老秦26 分钟前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
迈巴赫车主33 分钟前
Java基础:list、set、map一遍过
java·开发语言
灵犀学长1 小时前
基于 Spring ThreadPoolTaskScheduler + CronTrigger 实现的动态定时任务调度系统
java·数据库·spring
好家伙VCC2 小时前
【无标题】
java
小碗羊肉3 小时前
【JavaWeb | 第十一篇】文件上传(本地&阿里云OSS)
java·阿里云·servlet
吾疾唯君医3 小时前
Java SpringBoot集成积木报表实操记录
java·spring boot·spring·导出excel·积木报表·数据文件下载
Byron Loong4 小时前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
hexu_blog4 小时前
vue+java实现图片批量压缩
java·前端·vue.js
头歌实践平台4 小时前
Hadoop开发环境搭建
java·大数据·hadoop
Seven975 小时前
一致性Hash算法:如何实现分布式系统中的高效数据分片?
java