侯捷面向对象高级编程–Template Method设计模式
这个代码展示了 Template Method 设计模式 的应用。在这个模式中,基类定义了算法的框架,具体的实现步骤由子类来完成。基类提供了一个通用的操作骨架(即模板方法),其中可以调用一些可由子类覆盖的抽象方法或虚方法,子类可以通过重写这些方法来实现具体行为。
Template Method 模式的结构
- 基类 (CDocument):定义了算法的整体流程(
OnFileOpen()
),并且在流程中会调用一些方法(如Serialize()
),这些方法的具体实现交由子类提供。 - 子类 (CMyDoc):继承自基类,并且提供了
Serialize()
方法的具体实现,重写了基类中的虚函数。
UML图示
代码分析
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()
调用了基类CDocument
的OnFileOpen()
,但是在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 模式的关键
- 算法骨架:在基类中定义算法的整体流程,某些步骤留给子类实现(如
OnFileOpen()
中的Serialize()
)。 - 可扩展性:子类可以重写这些特定步骤,提供自己的实现,而不需要改变算法的整体流程。
- 稳定性:算法的整体结构是由基类控制的,因此保证了算法的稳定性,同时提供了灵活的扩展点。
在这个模式中,基类 CDocument
提供了模板方法 OnFileOpen()
,子类 CMyDoc
重写了 Serialize()
方法,从而实现了特定的行为。这就是典型的 Template Method 模式。