当前位置: 首页 > news >正文

设计模式——模板方法模式

模板方法模式(Template Method Pattern)是一种行为型设计模式,它在抽象类中定义了一个算法的框架,并将一些步骤延迟到子类中实现。这种模式使得子类可以在不改变算法结构的情况下重写算法中的某些特定步骤。

原理

  • 抽象模板类(Abstract Template Class): 定义一个操作中的算法骨架,包含了一个或多个“模板方法”,这些方法由基本代码和若干个待实现的抽象方法组成。
  • 具体模板类(Concrete Template Classes): 实现抽象模板类中声明的抽象方法,从而完成算法中未指定部分的具体逻辑。

Java代码示例

// 抽象模板类 - 烹饪基础流程
public abstract class CookingRecipe {
    // 模板方法
    public final void cookMeal() {
        prepareIngredients();
        cook();
        serve();
    }

    // 具体方法由抽象类实现
    protected void prepareIngredients() {
        System.out.println("Preparing ingredients...");
    }

    // 抽象方法,留给子类实现
    protected abstract void cook();

    // 具体方法由抽象类实现
    protected void serve() {
        System.out.println("Serving the meal...");
    }
}

// 具体模板类 - 蒸饭食谱
public class SteamedRiceRecipe extends CookingRecipe {
    @Override
    protected void cook() {
        System.out.println("Steaming rice...");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        CookingRecipe recipe = new SteamedRiceRecipe();
        recipe.cookMeal(); // 输出:Preparing ingredients... -> Steaming rice... -> Serving the meal...
    }
}

想象你正在教孩子做一道菜,这个过程中包含了切菜、炒菜和上菜三个步骤。作为家长,你会告诉孩子整个做菜的大致流程(模板方法),但是让孩子自己决定如何切菜和炒菜(抽象方法)。这样,每次做不同的菜时,只要按照你设定的基本流程走,但具体怎么切怎么炒可以根据不同菜品自由发挥。

应用场景

  • 框架与应用开发:许多Java框架如Spring MVC、Struts等都使用了模板方法模式,它们提供了一个处理请求的基本流程框架,开发者只需要覆盖其中的关键步骤来实现自己的业务逻辑。
  • 软件构建过程:构建工具Maven使用模板方法模式执行一系列构建任务,如清理、编译、测试、打包等,每个步骤都可以根据需要自定义扩展。
  • 游戏开发:游戏中角色的行为可以采用模板方法模式,比如战斗动作有一套通用的执行流程(准备、攻击、结束),但具体的攻击方式由各个角色类自己实现。

适用性

  • 当多个子类具有相同的算法结构,只是其中一部分实现细节有所不同时。
  • 控制子类必须遵循某种算法框架或者顺序时。
  • 一次性实现一种操作中的不变部分,并将可变的行为留给子类去实现。

相关文章:

  • Mysql的in与exits
  • 【Web】websocket应用的是哪个协议
  • 全链路压力测试:现代软件工程中的重要性
  • Maven和MyBatis框架简单实现数据库交互
  • GPT-4技术报告的解读(二)
  • haiku实现三角乘法模块
  • 说一下mysql的锁
  • Configure Virtual Serial Port Driver串口模拟器VSPD
  • 【手把手带你玩转MyBatis】基础篇:掌握事务管理,确保数据操作的原子性与一致性
  • 【JVM调优系列】如何导出堆内存文件
  • 微信小程序支付之V2支付
  • QT上位机开发(进度条操作)
  • 2024.1.14
  • 【驱动】TI AM437x(内核调试-06):网卡(PHY和MAC)、七层OSI
  • C++笔记
  • springcloud gateway动态路由
  • Erlang/OTP中的日志与事件处理(一)
  • vue2使用electron以及打包配置
  • 【小白专用】C# 连接 MySQL 数据库
  • K8S 日志方案
  • 山东发布高温橙警:预计19日至21日局地可达40℃
  • 关税影响下沃尔玛想涨价,特朗普施压:自行承担,别转嫁给顾客
  • 盐城经济技术开发区党工委书记王旭东接受纪律审查和监察调查
  • 雅典卫城上空现“巨鞋”形状无人机群,希腊下令彻查
  • 在本轮印巴冲突的舆论场上也胜印度一筹,巴基斯坦靠什么?
  • 中国证券业协会修订发布《证券纠纷调解规则》