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


    描述

    模板模式(Template Pattern)是设计模式中的一种行为型模式。
    该模式定义一个操作中的算法骨架,而将具体的算法实现延迟到子类中。
    模板模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

    实现原理

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

    示例

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

    步骤1

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

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    步骤1 分析

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

    步骤2

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

    // 普通消息
    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;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    步骤2 分析

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

    调用

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

    int main() {
        Message* nm = new NormalMessage();
        nm->send();
        delete nm;
    
        Message* um = new UrgentMessage();
        um->send();
        delete um;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    输出结果

    输出结果为:

    构造一条普通消息
    对普通消息进行加密
    发送普通消息
    构造一条加急消息
    对加急消息进行加密
    发送加急消息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结论

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

  • 相关阅读:
    一、MyBatis-Plus(未完成)
    SCDM 实例教程:基本几何建模
    Mysql基础
    k8s-pod管理 3
    python 数据保存格式的选择
    期末了,用Python写个自动批改作业系统
    Go 言 Go 语,一文看懂 Go 语言文件操作
    将Vue项目部署在Nginx,解决前端路由、反向代理和静态资源问题
    网络与信息安全基础知识--网络的协议与标准
    【WIP】Seastar框架学习
  • 原文地址:https://blog.csdn.net/MrHHHHHH/article/details/133562452