Template、Strategy、Observor属于构件协作类型的设计模式。
motivation:对于某一项任务,常常有稳定的整体操作结构,但是各个子步骤却又很多改变的需求,或者由于固有原因无法与整体任务结构一起实现(整体稳定,局部变化)。
key interface or class:
1.library或者framework—在框架或者类库中定义主流程,对变化的子类方法进行晚绑定;
2.application—调用者,实现变化的方法,调用主流程运行。
structure:
template codes:
//库或者框架的实现
class library{
public:
void run(){
//稳定的主流程步骤
step1();
step2(); //支持变化,使用虚函数来说实现多态
step3();
step4(); //支持变化,使用虚函数来说实现多态
step5();
}
virtual ~library(){};
protect:
//稳定步骤
void step1(){
//...
}
void step3(){
//...
}
void step4(){
//...
}
//变化步骤
virtual void step2()=0;
virtual void step4()=0;
}
//调用者的工作
//1.继承函数来实现变化的功能
class application: public library{
protect:
virtual void step2(){
//实现具体功能
};
virtual void step4(){
//实现具体功能
};
}
//调用主流程
int main(){
library* lib = new application();
lib->run();
delete lib;
}
summary:
1. template模式是非常基础的设计模式,为许多应用程序框架提供了灵活的扩展点;
2.“不要调用我,让我来调用你”的反向控制结构;
3.在template method中调用的虚函数,可以实现也可以没有实现(抽象方法或者纯虚方法)。