模板模式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(); }