【C++设计模式之模板模式】分析及示例

C++之模板模式

描述

模板模式(Template Pattern)是设计模式中的一种行为型模式。

该模式定义一个操作中的算法骨架,而将具体的算法实现延迟到子类中。

模板模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

实现原理

在C++中,模板模式一般通过一个父类定义一个算法框架,将算法中的某些步骤定义为虚函数。子类通过继承父类并重写这些虚函数的方式来实现具体的算法。

示例

下面是一个简单的C++模板模式示例,假设要实现一个消息发送系统,其中有两种不同类型的消息:普通消息和加急消息。它们的发送流程是不同的,但消息的基本结构相同。

可以使用模板模式来实现这个系统。

步骤1

首先,需要定义一个抽象消息基类Message,其中定义发送消息的算法框架:

cpp 复制代码
class Message {
public:
    // 发送消息的算法框架
    void send() {
        // 第一步:构造消息
        build_message();
        // 第二步:加密消息
        encrypt_message();
        // 第三步:发送消息
        send_message();
    }

protected:
    // 构造消息(抽象方法)
    virtual void build_message() = 0;
    // 加密消息(抽象方法)
    virtual void encrypt_message() = 0;
    // 发送消息(抽象方法)
    virtual void send_message() = 0;
};
步骤1 分析

上面的代码中,定义了一个send()方法作为算法框架,其中包含三个步骤:构造消息、加密消息和发送消息。这三个步骤都被定义为抽象方法,需要在子类中实现。

步骤2

可以定义两个具体的消息类型:普通消息(NormalMessage)和加急消息(UrgentMessage):

cpp 复制代码
// 普通消息
class NormalMessage : public Message {
protected:
    // 构造普通消息
    virtual void build_message() {
        cout << "构造一条普通消息" << endl;
    }
    // 加密普通消息
    virtual void encrypt_message() {
        cout << "对普通消息进行加密" << endl;
    }
    // 发送普通消息
    virtual void send_message() {
        cout << "发送普通消息" << endl;
    }
};

// 加急消息
class UrgentMessage : public Message {
protected:
    // 构造加急消息
    virtual void build_message() {
        cout << "构造一条加急消息" << endl;
    }
    // 加密加急消息
    virtual void encrypt_message() {
        cout << "对加急消息进行加密" << endl;
    }
    // 发送加急消息
    virtual void send_message() {
        cout << "发送加急消息" << endl;
    }
};
步骤2 分析

上面的代码中,分别重写了Message中的三个抽象方法,实现了普通消息和加急消息的具体功能。

调用

最后,可以使用这两个具体的消息类型来发送消息:

cpp 复制代码
int main() {
    Message* nm = new NormalMessage();
    nm->send();
    delete nm;

    Message* um = new UrgentMessage();
    um->send();
    delete um;

    return 0;
}
输出结果

输出结果为:

cpp 复制代码
构造一条普通消息
对普通消息进行加密
发送普通消息
构造一条加急消息
对加急消息进行加密
发送加急消息

结论

从上面的代码可以看出,通过继承Message并重写其中的抽象方法来实现了不同类型消息的发送,而算法框架仍然是由父类Message所提供的。这就是模板模式的核心思想。

相关推荐
佩奇的技术笔记1 分钟前
Java学习手册:客户端负载均衡
java·负载均衡
好吃的肘子20 分钟前
MongoDB 应用实战
大数据·开发语言·数据库·算法·mongodb·全文检索
ghost14322 分钟前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
小白学大数据23 分钟前
Scrapy框架下地图爬虫的进度监控与优化策略
开发语言·爬虫·python·scrapy·数据分析
立秋678930 分钟前
用Python绘制梦幻星空
开发语言·python·pygame
可乐加.糖32 分钟前
项目版本管理和Git分支管理方案
java·git·目标跟踪·gitlab·敏捷流程·源代码管理
汉克老师35 分钟前
GESP2025年3月认证C++二级( 第三部分编程题(1)等差矩阵)
c++·算法·矩阵·gesp二级·gesp2级
明月看潮生1 小时前
青少年编程与数学 02-019 Rust 编程基础 16课题、包、单元包及模块
开发语言·青少年编程·rust·编程与数学
wowocpp1 小时前
spring boot Controller 和 RestController 的区别
java·spring boot·后端
后青春期的诗go1 小时前
基于Rust语言的Rocket框架和Sqlx库开发WebAPI项目记录(二)
开发语言·后端·rust·rocket框架