模板方法
定义
定义一个操作中的算法的⻣架 ,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 ——《 设计模式》 GoF
背景
某个品牌动物园,有一套固定的表演流程,但是其中有若干个表演子流程受欢迎程度比较低,希望将这几个表演流程创新,以尝试迭代更新表演流程;
代码template1
#include <iostream> using namespace std; class ZooShow { public: void Show0(){ cout << "show0" << endl; } void Show2(){ cout << "show2" << endl; } }; class ZooShowEx { public: void Show1(){ cout << "show1" << endl; } void Show3(){ cout << "show3" << endl; } }; int main () { ZooShow *zs = new ZooShow; ZooShowEx *zs1 = new ZooShowEx; // 流程是固定的(稳定点),应该抽象出来;另外子流程是不应该暴露给客户,违反了接口隔离原则; zs->Show0(); zs1->Show1(); zs->Show2(); zs1->Show3(); return 0; }
代码template2
#include <iostream> using namespace std; class ZooShow { public: // 固定流程封装到这里 void Show() { Show0(); Show1(); Show2(); Show3(); } protected: // 子流程 使用protected保护起来 不被客户调用 但允许子类扩展 virtual void Show0(){ cout << "show0" << endl; } virtual void Show2(){ cout << "show2" << endl; } virtual void Show1() { } virtual void Show3() { } }; class ZooShowEx : public ZooShow { protected: virtual void Show1(){ cout << "show1" << endl; } virtual void Show3(){ cout << "show3" << endl; } virtual void Show4() { // } }; class ZooShowEx1 : public ZooShow { protected: virtual void Show0(){ cout << "show1" << endl; } virtual void Show2(){ cout << "show3" << endl; } }; class ZooShowEx2 : public ZooShow { protected: virtual void Show1(){ cout << "show1" << endl; } virtual void Show2(){ cout << "show3" << endl; } }; /* 依赖倒置原则 单一职责原则 接口隔离原则 反向控制:应用程序 框架 应用程序(变化的)应该依赖框架(稳定的),应该是框架去调应用程序,而不是应用程序去调框架 */ int main () { ZooShow *zs = new ZooShowEx; ZooShow *zs1 = new ZooShowEx1; ZooShow *zs2 = new ZooShowEx2; zs->Show(); return 0; }
要点
- 非常常用的设计模式,子类可以复写父类的子流程,使父类的大流程更丰富;
- 反向控制流程的典型应用;
- 父类 protected 保护子类需要复写的子流程;这样子类的子流程只能父类来调用;
- 充分体现了依赖倒置原则;
本质
通过固定算法⻣架来约束子类的行为;
结构图