一、类别
Template Method属于组件协作模式。
组件写作模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
典型模式:Template Method、Observer / Event、Strategy
二、定义
定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(重写)该算法的某些特定步骤。
三、代码对比
背景:对于应用程序的开发,一般是先创建Library,再创建Application,然后按照固定的步骤开始运行。
- 结构化软件实现方法:
class Library
{
public:
void step1()
{
cout << "step1" << endl;
}
void step3()
{
cout << "step3" << endl;
}
};
class Application
{
public:
void step2()
{
cout << "step2" << endl;
}
void step4()
{
cout << "step4" << endl;
}
};
int main()
{
Library lib;
Application app;
lib->step1();
app->step2();
lib->step3();
app->step4();
system("pause");
return 0;
}
这是一种早绑定:先实现Library,实现的具体流程在Application中,具体流程的实现依赖于Library。
- 采用Template Method
class Library
{
public:
void run()
{
step1();
step2();
step3();
step4();
}
protected:
void step1()
{
cout << "step1" << endl;
}
void step3()
{
cout << "step3" << endl;
}
virtual void step2() = 0;
virtual void step4() = 0;
};
class Application : public Library
{
protected:
virtual void step2()
{
cout << "step2" << endl;
}
virtual void step4()
{
cout << "step4" << endl;
}
};
int main()
{
Library *lib = new Application;
lib->run();
system("pause");
return 0;
}
这是一种晚绑定:先实现Library,Library中有实现流程,其中的流程依赖于较晚实现的Application。
四、要点总结
- Template Method用虚函数的多态性为应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
- 除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构的Template Method的典型应用。
- 在具体实现方面,被Template Method调用的虚函数推荐设置为protected方法,因为其只是框架的一步,不需要开放给外界,所以不该为public。同时,它也不应属于private。