模板方法Template Method模式
在稳定的整体操作结构中,子步骤可以进行变化来满足需求
template_lin.cpp
1 //程序库开发人员
2 class Library{
3
4 public:
5 void Step1(){
6 //...
7 }
8
9 void Step3(){
10 //...
11 }
12
13 void Step5(){
14 //...
15 }
16 };
template1_app.cpp
1 //应用程序开发人员 2 class Application{ 3 public: 4 bool Step2(){ 5 //... 6 } 7 8 void Step4(){ 9 //... 10 } 11 }; 12 13 int main() 14 { 15 Library lib(); 16 Application app(); 17 18 lib.Step1(); 19 20 if (app.Step2()){ 21 lib.Step3(); 22 } 23 24 for (int i = 0; i < 4; i++){ 25 app.Step4(); 26 } 27 28 lib.Step5(); 29 30 }
这种方式为早绑定在Application去调用Library。
template2_lib.cpp
class Library{ public: //稳定 template method void Run(){ Step1(); if (Step2()) { //支持变化 ==> 虚函数的多态调用 Step3(); } for (int i = 0; i < 4; i++){ Step4(); //支持变化 ==> 虚函数的多态调用 } Step5(); } virtual ~Library(){ } protected: void Step1() { //稳定 //..... } void Step3() {//稳定 //..... } void Step5() { //稳定 //..... } virtual bool Step2() = 0;//变化 virtual void Step4() =0; //变化 };
template2_app.cpp
//应用程序开发人员 class Application : public Library { protected: virtual bool Step2(){ //... 子类重写实现 } virtual void Step4() { //... 子类重写实现 } }; int main() { Library* pLib=new Application(); lib->Run(); delete pLib; } }
该种为晚绑定,Library中通过虚函数的方式来调用子类中方法
Template method模式即在软件构建中,具有稳定的操作结构(即代码运行逻辑稳定)但子步骤是变化的,
该模式意为稳定操作结构在父类中实现,变化的步骤延迟(虚函数)到子类中。
上面代码中代码1即操作结构在main()函数中实现,以早绑定方式去调用库。
代码2即将操作结构在父类中实现,以虚函数Step2(),Step4()的方式在延迟在子类中实现,只需要将变化的步骤在子类中重定义即可。
完全稳定和完全变化的结构都不适用设计模式,设计模式为在软件设计时分离稳定和变化的部分,来实现代码复用。
拓宽一下思路:如果这个流程中的各个步骤不是固定的,该如何设计呢?其实,应用层可以自己动态配置调用步骤。即可调用已有的接口满足小白用户需求,也可构建复杂流程完成专家级需求
run方法中的流程可以任意改变,只需通过动态配置即可,但流程中的各个变化任然可以通过子类的继承来实现多态
其实真正如的工业级代码非常复杂:模板方法模式中的稳定部分run不在模板类中,而在另外一个类中,这个流程是由若干类相互协作共同完成。