组件协作_TemplateMethod
目录
组件协作模式
现代软件专业分工之后的第一个结果是"框架与应用程序"的划分 组件协作是通过晚期绑定, 来实现框架和应用之间的松耦合, 是二者协作时常用的模式 典型模式有: Template Method, Strategy, Observer/Event
1 Template Method 模版模式
1.1 模式动机
在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求, 或者由于固有的原因(比如框架与应用的分离)而无法和任务的整体结构同时实现。 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?这就是一些重要问题。
1.2 模式定义
定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method 使得子类可以不改变(复用)一个算法的结构即可重定义(override)该算法的某些特定步骤。
1.3 模式示例代码
# include <iostream>
// 抽象类,定义模板方法
class Library {
public:
// 模板方法,定义算法骨架, 稳定
void templateMethod() {
step1();
step2();
step3();
}
virtual ~Library() {}
protected:
// 抽象步骤,由子类实现具体细节
virtual void step1() = 0;
virtual void step2() = 0;
virtual void step3() = 0;
};
// 具体类,实现模板方法
class Application : public Library {
protected:
void step1() override {
std::cout << "应用程序:步骤1" << std::endl;
}
void step2() override {
std::cout << "应用程序:步骤2" << std::endl;
}
void step3() override {
std::cout << "应用程序:步骤3" << std::endl;
}
};
int main() {
Library* instance = new Application();
instance->templateMethod();
delete instance;
return 0;
}
应用程序:步骤1
应用程序:步骤2
应用程序:步骤3
2 要点总结
- 不要调用我, 让我来调用你, 这种反向控制结构是 Template Method 的典型应用
- 虚函数是一个灵活的扩展点, 是代码复用的主要实现结构, 其它面向对象语言中也有类似的实现机制(接口等)