设计模式-组件协作模式之Template Method
“组件协作”模式
现代软件专业分工之后的第一个结果是“框架与应用的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式
场景,动机
在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,各个子步骤却有很多变化的需求,或者由于固有的原因而无法和任务的整体结构同时实现
如何在确定稳定的操作结构前提下,来灵活应对各个子步骤的变化或者晚期实现需求?
结构化编程和Tmplate method对比
- 结构化
//程序库(框架)开发人员
class Library{
public:
void step1(){
//...
}
void step3(){
//...
}
void step5(){
//...
}
}
//应用程序开发人员
class Application{
public:
bool step2(){
//...
}
bool step4(){
//...
}
}
int main()
{
Library lib();
Application app();
lib.step1;
if(app.step2()){
lib.step3();
}
app.step4();
lib.step5();
}
以上情况,属于应用开发人员依赖于程序库开发人员
- Tmplate method
//程序库(框架)开发人员
class Library{
public:
void run(){
step1();
if(step2()){//支持变化==>虚函数的多态调用
step3();
}
step4();//支持变化==>虚函数的多态调用
step5();
}
virtual ~Library(){}
protected:
void step1(){//稳定
//...
}
void step3(){//稳定
//...
}
void step5(){//稳定
//...
}
virtual bool step2() = 0;//变化
virtual bool step4() = 0;//变化
}
//应用程序开发人员
class Application : public Library{
protected:
virtual bool step2(){
//... 子类重写实现
}
virtual bool step4(){
//... 子类重写实现
}
}
int main()
{
Library* pLib = new Application();
pLib->run();
delete pLib;
}
对于template method方法,程序架构人员将程序框架搭好,为应用开发人员留出接口,应用开发人员只需要关注具体功能实现
定义
定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某些特定步骤
总结
- Template Method模式是一种非常基础的设计模式,在面向对象系统中有着大量的应用。它用最简单的机制(虚函数的多态性)为很多程序框架提供了灵活的扩展点,是代码复用方面的基本的实现结构。
- 除了可以灵活的应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。
- 在具体实现方面,被Template Method调用的虚方法可以有实现,也可以没有任何实现(抽象方法,纯虚方法),但一般把他们设置为protected方法
思考
- 其实template method方法最核心的思想就是将软件框架中不变的框架与具体的功能通过虚函数动态绑定的方式隔离开来。也就实现了由早绑定过渡到晚绑定
- 在面向对象编程时代,作为应用程序开发人员,可能不会有太多机会了解整体程序的运行框架和流程是怎样的。但是其实不应该只关注于具体功能实现,有可能的情况下,要弄清楚整体架构。
参考:
C++设计模式-李建忠