23种设计模式之模版方法模式

文章目录

模版方法模式

一、定义与概念

模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

二、作用与优势

  1. 代码复用
    • 模板方法模式将通用的算法框架提取到父类中,子类只需要实现特定的步骤,大大提高了代码的复用性。
    • 避免了重复编写相同的代码逻辑,减少了开发工作量。
  2. 算法框架固定
    • 确保了算法的整体结构稳定,不会因为个别子类的实现而改变。
    • 对于复杂的算法,通过模板方法可以更好地控制和管理整个流程。
  3. 易于扩展
    • 当需要增加新的功能或修改特定步骤时,可以通过创建新的子类来实现,不会影响到其他已有的代码。
    • 符合开闭原则,即对扩展开放,对修改关闭。

简单实现 - 炒菜

以下是以炒菜为例的简单模版方法模式实现:

1、定义模板类,cookDish方法为模版方法。

java 复制代码
public abstract class AbstractCookingRecipe {
    public final void cookDish() {
        heatOil();
        pourIngredients();
        stirFry();
        addSeasonings();
        dishOut();
    }

    abstract void heatOil();

    abstract void pourIngredients();

    abstract void stirFry();

    abstract void addSeasonings();

    abstract void dishOut();
}

2、继承模版类,实现抽象方法

java 复制代码
public class StirFryVegetables extends AbstractCookingRecipe {

    @Override
    void heatOil() {
        System.out.println("在锅中倒入适量油,加热至七成热。");
    }

    @Override
    void pourIngredients() {
        System.out.println("将洗净的蔬菜倒入锅中。");
    }

    @Override
    void stirFry() {
        System.out.println("不断翻炒蔬菜,使其均匀受热。");
    }

    @Override
    void addSeasonings() {
        System.out.println("加入适量盐、生抽等调料。");
    }

    @Override
    void dishOut() {
        System.out.println("将炒好的蔬菜出锅装盘。");
    }
}

3、测试使用

java 复制代码
public class TemplateTest {
    public static void main(String[] args) {
        new StirFryVegetables().cookDish();
    }
}

结果如下:

bash 复制代码
在锅中倒入适量油,加热至七成热。
将洗净的蔬菜倒入锅中。
不断翻炒蔬菜,使其均匀受热。
加入适量盐、生抽等调料。
将炒好的蔬菜出锅装盘。

总结

在这个实现中,抽象类AbstractCookingRecipe定义了炒菜的通用流程,具体的炒菜类(如StirFryVegetables)实现了这些抽象方法,从而按照特定的步骤完成炒菜操作。这样可以方便地扩展不同的炒菜菜谱,只需要继承抽象类并实现具体的方法即可。

相关推荐
Yyyyyy~3 分钟前
【java】运算符
java
古法安卓12 分钟前
Android-切换白天黑夜内存不足问题排查
android·java·android studio
Dreams_l19 分钟前
如何保证RabbitMQ消息可靠传输
java·rabbitmq·java-rabbitmq
MacroZheng21 分钟前
面试官皱眉:"你懂 Vibe Coding,那你说superpowers和grill-me怎么选?",我:"小孩才做选择,我全都要!"
java·人工智能·后端
大模型码小白23 分钟前
【AI大模型】DeepSeek Harness 深度解析:大模型评测框架的架构与实践
java·运维·人工智能·spring·架构·自动化
Mr.Java.29 分钟前
本地测试全绿,上线 SQL 报错?Spring Boot 容器级 DT 测试实战指南(附Skills)
java·测试用例·springboot·testcontainers·dt·java测试skills·dt测试
维天说1 小时前
Agent会听人话,反而更难管
java·开发语言·人工智能
SamDeepThinking1 小时前
if嵌套最好控制在3层以内
java·后端·程序员
边境悍匪1 小时前
蜗牛学苑 Java 智能体学习 Day36|阿里云 OSS 文件上传、Spring 事务、全局异常思维导图复盘
java·学习·阿里云
苏渡苇1 小时前
Spring Insight 里上报 Span 为什么用 JDK HttpClient 而不是 RestTemplate
java·后端·spring·spring cloud·springboot·性能监控