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

Template Method(模板方法)

1)意图

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

2)结构

模板方法模式的结构图如图7-47 所示。
在这里插入图片描述
其中:

  • AbstractClass(抽象类) 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤;实现模板方法,定一个算法的骨架,该模板方法不仅调用原语操作,也调用定义在 AbstractClass 或其他对象中的操作。

  • ConcreteClass(具体类) 实现原语操作以完成算法中与特定子类相关的步骤。

3)适用性

Template Method 模式适用于:

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

  • 各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复。

  • 控制子类扩展。模板方法旨在特定点调用“hook”操作(默认的行为,子类可以在必要时进行重定义扩展),这就只允许在这些点进行扩展。

4 应用举例

制作咖啡和茶

假设我们要设计一个系统来模拟制作咖啡和茶的过程,虽然制作咖啡和茶的基本步骤相似(如烧水、倒水、加配料),但某些步骤会有差异(如是否需要磨豆子、是否需要泡茶叶)。这里可以使用模板方法模式来实现。

Java代码示例:

// 抽象类:定义制作饮品的模板方法
abstract class Beverage {// 模板方法,定义算法的骨架public final void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();}protected void boilWater() {System.out.println("烧开水");}protected void pourInCup() {System.out.println("倒入杯中");}// 抽象方法,由子类实现abstract protected void brew();// 钩子方法,允许子类覆盖默认行为protected void addCondiments() {System.out.println("添加配料");}
}// 具体类:实现不同的饮品制作过程
class Coffee extends Beverage {@Overrideprotected void brew() {System.out.println("研磨咖啡豆");}@Overrideprotected void addCondiments() {System.out.println("加入糖和奶");}
}class Tea extends Beverage {@Overrideprotected void brew() {System.out.println("浸泡茶叶");}
}public class TemplateMethodPatternDemo {public static void main(String[] args) {// 制作咖啡Beverage coffee = new Coffee();System.out.println("制作咖啡:");coffee.prepareRecipe();System.out.println();// 制作茶Beverage tea = new Tea();System.out.println("制作茶:");tea.prepareRecipe();}
}

在这个例子中:

  • Beverage 是抽象类,定义了制作饮品的模板方法 prepareRecipe(),其中包含了所有饮品制作的通用步骤。
  • CoffeeTea 是具体类,它们分别实现了 brew() 方法,以适应各自的特点。同时,addCondiments() 方法在 Coffee 中被覆盖,以加入特定的配料。

通过模板方法模式,我们可以定义一个算法的框架,同时允许子类控制算法的细节,这有助于代码的复用和维护。


http://www.mrgr.cn/news/65934.html

相关文章:

  • 小白挖漏洞必备的两个平台!有技术就能挖,没有上限,光靠挖洞月入1w+的都大有人在!_漏洞挖掘提交网站。
  • 不同的科技查新机构之间有什么区别?
  • Android亮屏Job的功耗优化方案
  • 消息中间件类型介绍
  • 远程控制项目第二天
  • Qt 调用libcurl 执行curl_easy_perform 闪退问题之记录
  • (八)关于InternVL2的优化加速——如何提高三倍的推理速度
  • 基于SpringBoot的母婴商城的设计与实现
  • 面试“利器“——微学时光
  • MySQL45讲 第十一讲 怎么给字符串字段加索引?
  • 责任链模式 Chain of Responsibility
  • 【指南】这款安全数据交换系统 架构全面创新优化
  • 分类算法——逻辑回归 详解
  • github.com port 22
  • Spring:Bean(创建方式,抽象继承,工厂Bean,生命周期)
  • H5开发指南|掌握核心技术,玩转私域营销利器
  • ES + SkyWalking + Spring Boot:日志分析与服务监控(三)
  • 数据结构————链表
  • MODBUS-TCP全解:有这一篇就够了
  • IP SSL证书
  • 2024年CISSP认证考试通关秘籍:备考方法与实战经验分享
  • idea java 项目右键new file时 为什么是 kotlin class 不是普通class
  • CDGP|数据资产入表:解锁数据价值,驱动数据要素流通的关键引擎
  • Memento 备忘录模式
  • 路径规划 | ROS中多个路径规划算法可视化与性能对比分析
  • 【Vue 全家桶】5、Vuex(更新中)