组件协作模式
组件协作模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式
- Template Method
- Strategy
- Observer/Event
Template Method
模板方法
对于某一项任务,有稳定的整体操作结构,但各个步骤却有改变的需求,或者由于固有的原因(比如框架和应用之间的关系)而无法和任务的整体结构同时实现
对于应用程序的开发,一般是先创建Library,再创建Application,然后按照固定的步骤开始运行
// 程序库开发人员
class Library {
public:
void step1() {
// ...
}
void step3() {
// ...
}
void step5() {
// ...
}
};
// 应用程序开发人员
class Application {
public:
bool step2() {
// ...
}
void step4() {
// ...
}
};
int main() {
Library lib();
Application app();
lib.step1();
if (app.step2()) {
lib.step3();
}
for (int i = 0; i < 4; i++) {
app.step4();
}
lib.step5();
return 0;
}
框架开发人员可以把流程也写了,但是具体需要应用程序人员自己开发的部分声明为虚函数
// 程序库开发人员
class Library {
public:
void Run() {
step1();
if (step2()) { // 支持变化 -> 虚函数的多态调用
step3();
}
for (int i = 0; i < 4; i++) {
step4(); // 支持变化 -> 虚函数的多态调用
}
step5();
}
void step1() { // 稳定
// ...
}
void step3() { // 稳定
// ...
}
void step5() { // 稳定
// ...
}
virtual bool step2() = 0; // 变化
virtual void step4() = 0; // 变化
virtual ~Library() {}
};
这样应用程序开发人员就继承这个类,实现自定义的方法就行,具体流程就直接调用Library写好的方法
// 应用程序开发人员
class Application : public Library {
public:
virtual bool step2() {
// 子类重写方法
}
virtual void step4() {
// 子类重写方法
}
};
int main() {
Library *pLib = new Application();
pLib->Run();
delete pLib;
return 0;
}
早绑定与晚绑定
Application 调用 Library 称为早绑定
Library 调用 Application 称为晚绑定,因为需要调用 Application 里面具体的虚函数
模式定义
定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中,Template Method 使得子类可以不改变一个算法的结构即可重定义(override,重写)该算法的某些特定步骤