场景
原代码
template1_lib.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 }
template1_app.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 };
重构后
template2_lib.cpp
1 //程序库开发人员 2 class Library{ 3 public: 4 //稳定 template method 5 void Run(){ 6 7 Step1(); 8 9 if (Step2()) { //支持变化 ==> 虚函数的多态调用 10 Step3(); 11 } 12 13 for (int i = 0; i < 4; i++){ 14 Step4(); //支持变化 ==> 虚函数的多态调用 15 } 16 17 Step5(); 18 19 } 20 virtual ~Library(){ } 21 22 protected: 23 24 void Step1() { //稳定 25 //..... 26 } 27 void Step3() {//稳定 28 //..... 29 } 30 void Step5() { //稳定 31 //..... 32 } 33 34 virtual bool Step2() = 0;//变化 35 virtual void Step4() =0; //变化 36 };
template2_app.cpp
1 //应用程序开发人员 2 class Application : public Library { 3 protected: 4 virtual bool Step2(){ 5 //... 子类重写实现 6 } 7 8 virtual void Step4() { 9 //... 子类重写实现 10 } 11 }; 12 13 int main() 14 { 15 Library* pLib=new Application(); 16 lib->Run(); 17 18 delete pLib; 19 } 20 }
细节
原文:https://www.cnblogs.com/cxc1357/p/12271922.html