Template Method 设计模式

server/2025/3/6 3:34:27/

模板方法模式(Template Method Pattern) 是一种 行为型设计模式,用于定义 算法的骨架,并允许子类在不改变算法结构的情况下 重新定义 其中的某些步骤。

核心思想:

  • 基类 中定义 算法的整体流程(骨架),但具体的实现留给 子类
  • 基类 只负责调用流程,具体逻辑由 子类 来实现,符合 “开放封闭原则”(对扩展开放,对修改封闭)。

1. 结构

类图

+----------------------+
|   AbstractClass      |  (抽象类)
+----------------------+
| + templateMethod()   |  (定义算法的骨架)
| + step1()            |  (基本方法,可能有默认实现)
| + step2()            |  (抽象方法,交由子类实现)
+----------------------+▲│
+----------------------+
|   ConcreteClass      |  (具体子类)
+----------------------+
| + step2()           |  (实现父类的抽象方法)
+----------------------+

代码示例

#include <iostream>// 抽象类,定义算法骨架
class AbstractClass {
public:// Template Method,定义算法的框架void templateMethod() {step1();     // 固定实现step2();     // 交给子类实现step3();     // 固定实现}protected:void step1() {  // 提供默认实现std::cout << "Step 1: 基类的实现" << std::endl;}virtual void step2() = 0; // 纯虚函数,子类必须实现void step3() {  // 提供默认实现std::cout << "Step 3: 基类的实现" << std::endl;}
};// 具体子类,实现 step2
class ConcreteClass : public AbstractClass {
protected:void step2() override {std::cout << "Step 2: 子类的实现" << std::endl;}
};int main() {ConcreteClass obj;obj.templateMethod();  // 调用模板方法return 0;
}

2. 关键点

  1. templateMethod()基类 中定义算法的结构,并且不允许子类重写
  2. 部分方法(step1step3 在基类中有默认实现,子类可以直接继承。
  3. 部分方法(step2virtual(纯虚函数),子类必须实现自己的逻辑。

3. 适用场景

场景原因
多个类的算法流程相同,但部分步骤不同避免重复代码,提高复用性
算法的某些步骤可能会变化,但主流程不变通过子类扩展,而不影响基类
需要控制子类扩展的范围只允许子类修改某些特定步骤

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

相关文章

Lua的table(表)

Lua表的基本概念 Lua中的表&#xff08;table&#xff09;是一种多功能数据结构&#xff0c;可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制&#xff0c;其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成&#xff1a; 数组部分…

塔能科技:工厂智慧照明,从底层科技实现照明系统的智能化控制

在全球节能减碳和智慧生活需求激增的背景下&#xff0c;基于“用软件定义硬件&#xff0c;让物联运维更简捷更节能”的产品理念&#xff0c;塔能科技的智慧照明一体化方案如新星般崛起&#xff0c;引领照明行业新方向。现在&#xff0c;我们来深入探究其背后的创新技术。该方案…

应对现代生活的健康养生指南

在科技飞速发展的现代社会&#xff0c;人们的生活方式发生了巨大改变&#xff0c;随之而来的是一系列健康问题。快节奏的生活、高强度的工作以及电子产品的过度使用&#xff0c;让我们的身体承受着前所未有的压力。因此&#xff0c;掌握正确的健康养生方法迫在眉睫。 针对久坐不…

服务器间免密登录

1. 生成SSH密钥对 在本地客户端生成SSH密钥对。生成密钥对命令为&#xff1a; ssh-keygen -t rsa 按回车键确认默认设置&#xff0c;生成的密钥对将保存在 ~/.ssh/id_rsa&#xff08;私钥&#xff09;和 ~/.ssh/id_rsa.pub&#xff08;公钥&#xff09;。 2. 上传密钥对至需…

从入门到精通:Linux 权限管理(rwx/chmod/chown)

目录 1. 引言&#xff1a;为什么需要文件权限&#xff1f; 2. 基础概念&#xff1a;理解 rwx 权限 &#xff08;1&#xff09;权限的三种角色 &#xff08;2&#xff09;权限的三种类型 &#xff08;3&#xff09;权限的两种表示法 &#xff08;4&#xff09; 目录的 rwx…

多个pdf合并成一个pdf的方法

将多个PDF文件合并优点&#xff1a; 能更容易地对其进行归档和备份.打印时可以选择双面打印&#xff0c;减少纸张的浪费。比如把住宿发票以及滴滴发票、行程单等生成一个pdf&#xff0c;双面打印或者无纸化办公情况下直接发送给财务进行存档。 方法: 利用PDF24 Tools网站 …

RabbitMQ系列(七)基本概念之Channel

RabbitMQ 中的 Channel&#xff08;信道&#xff09; 是客户端与 RabbitMQ 服务器通信的虚拟会话通道&#xff0c;其核心作用在于优化资源利用并提升消息处理效率。以下是其核心机制与功能的详细解析&#xff1a; 一、Channel 的核心定义 虚拟通信链路 Channel 是建立在 TCP 连…

Qt显示一个hello world

一、显示思路 思路一&#xff1a;通过图形化方式&#xff0c;界面上创建出一个控件显示。 思路二&#xff1a;通过编写C代码在界面上创建控件显示。 二、思路一实现 点开 Froms 的 widget.ui&#xff0c;拖拽 label 控件&#xff0c;显示 hello world 即可。 qmake 基于 .…