23种设计模式-模板方法(Template Method)设计模式

server/2024/11/23 18:37:57/

文章目录


类图: 模板方法设计模式类图

一.什么是模板方法模式

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,而将一些步骤的实现延迟到子类中。通过这种方式,模板方法允许子类在不改变算法结构的情况下重新定义某些步骤的具体实现。

二.模板方法模式的特点

  1. 算法骨架固定:整体流程在父类中定义,子类只需实现特定步骤。
  2. 代码复用:通用的算法步骤可以在父类中实现,避免重复代码。
  3. 扩展灵活:新增子类时,只需重写相关步骤,无需修改已有代码。

三.模板方法模式的结构

  1. AbstractClass(抽象类)
    • 定义算法的骨架(TemplateMethod),包括一系列步骤(PrimitiveOperation)。
    • 部分步骤由子类实现(抽象方法)。
  2. ConcreteClass(具体类)
    • 实现抽象类定义的抽象方法。
    • 可以根据需要扩展或修改步骤的具体实现。
      模板方法类图

四.模板方法模式的应用场景

  1. 多个子类有共同行为逻辑,但具体实现不同。
  2. 固定的流程需要扩展某些步骤
  3. 避免重复代码,提取通用逻辑。

五.模板方法模式的优缺点

  • 优点
    • 提高代码复用性。
    • 强制遵循一致的算法框架。
    • 易于维护和扩展。
  • 缺点
    • 子类数目较多时,代码可能变得复杂。
    • 设计要求较高,需要仔细分析算法流程。

六.模板方法模式的C++实现

#include <iostream>
using namespace std;// 抽象类 AbstractClass
class AbstractClass {
public:// 模板方法,定义算法骨架void TemplateMethod() {PrimitiveOperation1(); // 第一步PrimitiveOperation2(); // 第二步Hook();                // 钩子方法(可选)}// 基本操作,子类必须实现virtual void PrimitiveOperation1() = 0;virtual void PrimitiveOperation2() = 0;// 钩子方法,子类可以选择性重写virtual void Hook() {cout << "AbstractClass: Default Hook implementation.\n";}virtual ~AbstractClass() = default;
};// 具体类 ConcreteClass
class ConcreteClass : public AbstractClass {
public:void PrimitiveOperation1() override {cout << "ConcreteClass: Implementing PrimitiveOperation1.\n";}void PrimitiveOperation2() override {cout << "ConcreteClass: Implementing PrimitiveOperation2.\n";}void Hook() override {cout << "ConcreteClass: Overriding Hook method.\n";}
};// 客户端代码
int main() {cout << "Using Template Method Pattern:\n";AbstractClass* obj = new ConcreteClass();obj->TemplateMethod(); // 调用模板方法delete obj;return 0;
}

JAVA_87">七.模板方法模式JAVA实现

// 抽象类
abstract class AbstractClass {// 模板方法public final void TemplateMethod() {PrimitiveOperation1();PrimitiveOperation2();}// 抽象基本操作(必须由子类实现)protected abstract void PrimitiveOperation1();protected abstract void PrimitiveOperation2();
}// 具体类A
class ConcreteClassA extends AbstractClass {@Overrideprotected void PrimitiveOperation1() {System.out.println("ConcreteClassA: Performing PrimitiveOperation1");}@Overrideprotected void PrimitiveOperation2() {System.out.println("ConcreteClassA: Performing PrimitiveOperation2");}
}// 具体类B
class ConcreteClassB extends AbstractClass {@Overrideprotected void PrimitiveOperation1() {System.out.println("ConcreteClassB: Performing PrimitiveOperation1");}@Overrideprotected void PrimitiveOperation2() {System.out.println("ConcreteClassB: Performing PrimitiveOperation2");}
}// 客户端代码
public class TemplateMethodPatternDemo {public static void main(String[] args) {// 使用 ConcreteClassAAbstractClass classA = new ConcreteClassA();System.out.println("ConcreteClassA Template Method Execution:");classA.TemplateMethod();// 使用 ConcreteClassBAbstractClass classB = new ConcreteClassB();System.out.println("\nConcreteClassB Template Method Execution:");classB.TemplateMethod();}
}

八.代码解析

  1. 抽象类
    • TemplateMethod() 是模板方法,定义了算法的执行顺序。
    • PrimitiveOperation1 和 PrimitiveOperation2 是抽象方法,具体实现由子类完成。
    • Hook 是钩子方法,提供默认实现,子类可以选择性重写。
  2. 具体类
    • ConcreteClass 实现了抽象类的抽象方法,并可根据需要覆盖钩子方法。
  3. 客户端代码
    • 创建一个具体类的实例,通过抽象类指针调用模板方法。

九.总结

模板方法模式通过定义一个算法的通用骨架,为子类提供了灵活的扩展点。它适用于多个子类具有相似逻辑但部分实现不同的场景。通过这种模式,代码的复用性和扩展性得到了极大提升,同时保证了算法逻辑的一致性。


http://www.ppmy.cn/server/144325.html

相关文章

大数据基于Spring Boot的化妆品推荐系统的设计与实现

摘 要 随着大数据时代的到来&#xff0c;人们对于个性化服务的需求越来越高。化妆品推荐系统作为一个认知智能模型段&#xff0c;在为消费者提供更好的购物体验方面发挥了重要作用。本研究基于大数据技术设计了一个高效准确的化妆品推荐系统。通过对海量数据的分析和处理&…

Spark使用过程中的 15 个常见问题、详细解决方案

目录 问题 1&#xff1a;Spark 作业超时问题描述解决方案Python 实现 问题 2&#xff1a;内存溢出问题描述解决方案Python 实现 问题 3&#xff1a;Shuffle 性能问题问题描述解决方案Python 实现 问题 4&#xff1a;Spark 作业调度不均问题描述解决方案Python 实现 问题 5&…

springboot:责任链模式实现多级校验

责任链模式是将链中的每一个节点看作是一个对象&#xff0c;每个节点处理的请求不同&#xff0c;且内部自动维护一个下一节点对象。 当一个请求从链式的首段发出时&#xff0c;会沿着链的路径依此传递给每一个节点对象&#xff0c;直至有对象处理这个请求为止。 属于行为型模式…

如何不使用密码,通过ssh直接登录服务器

在 Mac 上生成 SSH 密钥&#xff08;如果尚未生成&#xff09; 如果你还没有生成密钥&#xff0c;可以按照以下步骤在终端中生成 SSH 密钥对&#xff1a; 打开终端&#xff0c;执行命令&#xff1a; bash ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" …

金融量化交易模型的探索与发展

随着全球金融市场的不断变化与技术进步&#xff0c;量化交易逐渐成为机构和个人投资者的重要选择。作为数据驱动的交易方式&#xff0c;量化交易通过科学建模和技术手段&#xff0c;有效提升了交易效率与决策精准度。本文将探讨金融量化交易模型的创新探索与未来发展方向。 量化…

《OpenCV 图像缩放、翻转与变换全攻略:从基础操作到高级应用实战》

简介&#xff1a;本文详细阐述了 OpenCV 在图像操作中的关键技术&#xff0c;包括缩放&#xff08;确定尺寸缩放与按比例缩放&#xff09;、翻转&#xff08;沿不同轴的翻转方式&#xff09;以及变换&#xff08;平移、旋转、三点确定变换和四点确定变换即透视变换&#xff09;…

Vue3 源码解析(十):watch 的实现原理

本篇文章笔者会讲解 Vue3 中侦听器相关的 api&#xff1a;watchEffect 和 watch 。在 Vue3 之前 watch 是 option 写法中一个很常用的选项&#xff0c;使用它可以非常方便的监听一个数据源的变化&#xff0c;而在 Vue3 中随着 Composition API 的写法推行也将 watch 独立成了一…

hive的存储格式

1&#xff09; 四种存储格式 hive的存储格式分为两大类&#xff1a;一类纯文本文件&#xff0c;一类是二进制文件存储。 Hive支持的存储数据的格式主要有&#xff1a;TEXTFILE、SEQUENCEFILE、ORC、PARQUET 第一类&#xff1a;纯文本文件存储 textfile: 纯文本文件存储格式…