C++——Template Method设计模式

侯捷面向对象高级编程–Template Method设计模式


在这里插入图片描述

这个代码展示了 Template Method 设计模式 的应用。在这个模式中,基类定义了算法的框架,具体的实现步骤由子类来完成。基类提供了一个通用的操作骨架(即模板方法),其中可以调用一些可由子类覆盖的抽象方法或虚方法,子类可以通过重写这些方法来实现具体行为。

Template Method 模式的结构

  • 基类 (CDocument):定义了算法的整体流程(OnFileOpen()),并且在流程中会调用一些方法(如 Serialize()),这些方法的具体实现交由子类提供。
  • 子类 (CMyDoc):继承自基类,并且提供了 Serialize() 方法的具体实现,重写了基类中的虚函数。

UML图示

CDocument
+OnFileOpen()
+virtual Serialize()
CMyDoc
+Serialize()

代码分析

CDocument 类
class CDocument {
public:
    void OnFileOpen() {// 打开文件的通用流程
        // ...
        Serialize(); // 调用子类的具体实现
        // 继续处理文件打开后的操作
        // ...
    }
    // 声明为虚函数,子类会重写这个方法
    virtual void Serialize() {
        // 默认实现(如果有的话)
    }
};
  • CDocument::OnFileOpen():实现了文件打开的通用流程。在这个流程中,有一个关键步骤是 Serialize(),这个步骤的具体实现会在子类中完成。
  • Serialize():一个虚函数,表示需要序列化数据。基类可以提供默认实现,也可以不实现(变成纯虚函数),由子类重写这个方法。
CMyDoc 类
class CMyDoc : public CDocument {
public:
    virtual void Serialize() override {
        // 提供CMyDoc特有的序列化逻辑
        // 具体的数据读写逻辑
    }
};
  • CMyDoc:继承自 CDocument,并且重写了 Serialize() 方法,提供了特定文档类型的序列化逻辑。
main 函数
int main() {
    CMyDoc myDoc;
    // ...
    myDoc.OnFileOpen();  // 调用基类中的 OnFileOpen, 但实际调用的是 CMyDoc::Serialize()
    return 0;
}
  • main() 函数中,myDoc.OnFileOpen() 调用了基类 CDocumentOnFileOpen(),但是在 OnFileOpen() 中会调用 Serialize() 方法,而这个方法在子类 CMyDoc 中被重写,因此会执行子类的 Serialize() 逻辑。(可以看一下上面的那个图,灰线表示运行过程)

完整代码
代码如下:

#include <iostream>
using namespace std;

class CDocument {
public:
    // 文件打开的模板方法,定义了文件打开的流程
    void OnFileOpen() {
        cout << "dialog..." << endl;               // 显示对话框
        cout << "check file status..." << endl;    // 检查文件状态
        cout << "open file..." << endl;            // 打开文件
        Serialize();                               // 调用具体文档类型的序列化操作
        cout << "close file..." << endl;           // 关闭文件
        cout << "update all views..." << endl;     // 更新所有视图
    }
    // 虚函数,子类会提供具体的序列化实现
    virtual void Serialize() {
        // 默认实现可以为空或者提供基本行为
    }
};

class CMyDoc : public CDocument {
public:
    // 重写基类的序列化函数
    virtual void Serialize() override {
        cout << "CMyDoc::Serialize()" << endl;  // 输出CMyDoc的序列化操作
    }
};

int main() {
    CMyDoc myDoc;  // 假设执行[File/Open]操作
    myDoc.OnFileOpen();  // 打开文件,并调用模板方法 OnFileOpen
    return 0;
}

Template Method 模式的关键

  1. 算法骨架:在基类中定义算法的整体流程,某些步骤留给子类实现(如 OnFileOpen() 中的 Serialize())。
  2. 可扩展性:子类可以重写这些特定步骤,提供自己的实现,而不需要改变算法的整体流程。
  3. 稳定性:算法的整体结构是由基类控制的,因此保证了算法的稳定性,同时提供了灵活的扩展点。

在这个模式中,基类 CDocument 提供了模板方法 OnFileOpen(),子类 CMyDoc 重写了 Serialize() 方法,从而实现了特定的行为。这就是典型的 Template Method 模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值