模板模式ios
做用:定义一个操做中的算法的骨架。而将一些步骤延迟到子类中,模板方法使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。其关键是将通用算法(逻辑)封装在抽象基类中,并将不一样的算法细节放到子类中实现。算法
在我看来,模板模式的好处在于能减小代码段的复用,把公共行为封装到基类中,把行为流程的实现函数写在基类中,这样在对于不一样状况的不一样子类,在子类中修改或重写函数便可,并且子类没必要担忧具体流程。函数
优势:一、封装不变部分,扩展可变部分。spa
二、提取公共代码,便于维护。对象
三、行为由父类控制,子类实现。blog
缺点:每个不一样的实现都须要一个子类来实现,致使类的个数增长,使得系统更加庞大。开发
假如一个开发商要建造三所房子,每一个房子建造的过程当中有些步骤是固定的,如先建造地基,而后砌墙,再而后进行墙面装饰,而后进行内部装修。但虽然步骤同样,但不一样的房子可能会采用不一样的建筑风格,下面写程序来实现这个过程io
假如不采用模板模式,每一个房子是一个类,每一个类中建房子步骤的具体细节可能会有差别,因此相同的函数中要写不一样的实现,代码以下:模板
#include <iostream> using namespace std; class House1 { public: void foundation() { cout<<"1.打地基"<<endl;; } void wall() { cout<<"2.按图纸1给房子1砌墙"<<endl;; } void color() { cout<<"3.粉刷白颜色的墙"<<endl;; } void decorte() { cout<<"4.进行欧美风内部装修"<<endl;; } }; class House2 { public: void foundation() { cout<<"1.打地基"; } void wall() { cout<<"2.按图纸2给房子2砌墙"<<endl;; } void color() { cout<<"3.粉刷绿颜色的墙"<<endl;; } void decorte() { cout<<"4.进行古风内部装修"<<endl; } }; class House3 { public: void foundation() { cout<<"1.打地基"<<endl;; } void wall() { cout<<"2.按图纸3给房子3砌墙"<<endl;; } void color() { cout<<"3.粉刷粉颜色的墙"<<endl;; } void decorte() { cout<<"4.进行哥特风内部装修"<<endl;; } }; int main() { House1 a1; a1.foundation(); a1. wall(); a1.color(); a1.decorte(); cout<<"================================================="<<endl; House2 a2; a2.foundation(); a2. wall(); a2.color(); a2.decorte(); House3 a3; cout<<"================================================="<<endl; a3.foundation(); a3. wall(); a1.color(); a3.decorte(); }
此种写法不只代码量大,在建造对象时,每一个不一样的对象本身在主函数都要调用一遍步骤流程,并且假如如今要求在粉刷墙漆前要先粉刷一遍防火漆,修改时要对每一个类进行添加函数,非常麻烦,若是采用模板模式来编写,这些问题均可以获得很好的解决,把公共的函数以及部分实现定义在基类中,再把流程封装在一个函数中,不一样的子类继基类后直接重写不一样的函数便可,并且对于防火漆这一需求,只须要在基类中定义并加入流程函数就能够了,子类在调用流程函数时会自动执行。具体代码以下:class
#include <iostream> using namespace std; class Base { protected: void foundation() { cout<<"1.打地基"<<endl; } void ex() { cout<<"刷防火漆"<<endl; } public: virtual void wall()=0; virtual void color()=0; virtual void decorte()=0; void run() { foundation(); wall(); ex(); color(); decorte(); } }; class House1:public Base { public: void wall() { cout<<"2.按图纸1给房子1砌墙"<<endl;; } void color() { cout<<"3.粉刷白颜色的墙"<<endl;; } void decorte() { cout<<"4.进行欧美风内部装修"<<endl;; } }; class House2:public Base { public: void wall() { cout<<"2.按图纸2给房子2砌墙"<<endl;; } void color() { cout<<"3.粉刷绿颜色的墙"<<endl;; } void decorte() { cout<<"4.进行古风内部装修"<<endl; } }; class House3:public Base { public: void wall() { cout<<"2.按图纸3给房子3砌墙"<<endl;; } void color() { cout<<"3.粉刷粉颜色的墙"<<endl;; } void decorte() { cout<<"4.进行哥特风内部装修"<<endl;; } }; int main() { Base *a=new House1; a->run(); cout<<"================================================="<<endl; a=new House2; a->run(); cout<<"================================================="<<endl; a=new House3; a->run(); }