template method(模板方法)
2019-10-03 16:15
1481 查看
一.引入
二.template method(模板方法)
代码示例:
一开始的代码:
template1_app.cpp:
//应用程序开发人员 class Application{ public: bool Step2(){ //... } void Step4(){ //... } }; int main() { Library lib; //这里都是以类的方式来调用方法的 Application app; lib.Step1(); if (app.Step2()){ lib.Step3(); } for (int i = 0; i < 4; i++){ app.Step4(); } lib.Step5(); }
对应的库的代码:
template1_lib.cpp:
//程序库开发人员 class Library{ public: void Step1(){ //... } void Step3(){ //... } void Step5(){ //... } };
这里的主体程序流程,实际上框架开发者已经设计好了,常常是稳定的.
因此更好的解决方案是,库开发者把流程写好,一些需要开发者实现的接口定义好,留给开发者实现:
改进后的代码:
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: //采用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; } }
注意一下:
基类的析构函数要写成虚的,否则调用不到子类的析构函数,因为如果不是虚函数的话,
基类指针只能找到基类的析构函数,delete时只会调用基类的析构函数;而析构函数为虚函数时,则基类指针可以找到子类对应的析构函数.
红色部分时稳定的,蓝色部分是变化的.
相关文章推荐
- 【java设计模式】之 模板方法(Template Method)模式
- 设计模式 模板方法模式 Template Method
- 设计模式(行为型)之模板方法模式(Template Method Pattern)
- Java之模板方法模式(Template Method)
- 设计模式——模板方法模式(Template Method)
- java模板方法设计模式(Template Method)
- 设计模式1--template method(模板方法)
- 模板方法模式(Template Method Pattern)
- 设计模式-模板方法模式(Template Method Pattern)
- 14、模板方法模式(Template Method)
- Design Pattern学习笔记 --- 模板方法(Template Method)模式
- Java设计模式之--模板方法模式(Template Method)
- 【Unity3D与23种设计模式】模板方法模式(Template Method)
- Java设计模式之模板方法模式(Template Method)
- 设计模式 - 模板方法(Template Method)
- 模板方法(template Method) in Java
- Java设计模式透析之 —— 模板方法(Template Method)
- 23种设计模式之模板方法(Template Method)
- Java设计模式之模板方法模式(Template Method)
- 模板方法模式(Template Method)