模板模式 作用:定義一個操作中的演算法的骨架。而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。其關鍵是將通用演算法(邏輯)封裝在抽象基類中,並將不同的演算法細節放到子類中實現。 在我看來,模板模式的好處在於能減少代碼段的復用,把公共行為封裝到基類中,把行為 ...
模板模式
作用:定義一個操作中的演算法的骨架。而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。其關鍵是將通用演算法(邏輯)封裝在抽象基類中,並將不同的演算法細節放到子類中實現。
在我看來,模板模式的好處在於能減少代碼段的復用,把公共行為封裝到基類中,把行為流程的實現函數寫在基類中,這樣在對於不同情況的不同子類,在子類中修改或重寫函數即可,而且子類不必擔心具體流程。
優點:1、封裝不變部分,擴展可變部分。
2、提取公共代碼,便於維護。
3、行為由父類控制,子類實現。
缺點:每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。
假如一個開發商要建造三所房子,每個房子建造的過程中有些步驟是固定的,如先建造地基,然後砌牆,再然後進行牆面裝飾,然後進行內部裝修。但雖然步驟一樣,但不同的房子可能會採用不同的建築風格,下麵寫程式來實現這個過程
假如不採用模板模式,每個房子是一個類,每個類中建房子步驟的具體細節可能會有差異,所以相同的函數中要寫不同的實現,代碼如下:
#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(); }
此種寫法不僅代碼量大,在建造對象時,每個不同的對象自己在主函數都要調用一遍步驟流程,而且假如現在要求在粉刷牆漆前要先粉刷一遍防火漆,修改時要對每個類進行添加函數,很是麻煩,如果採用模板模式來編寫,這些問題都可以得到很好的解決,把公共的函數以及部分實現定義在基類中,再把流程封裝在一個函數中,不同的子類繼基類後直接重寫不同的函數即可,而且對於防火漆這一需求,只需要在基類中定義並加入流程函數就可以了,子類在調用流程函數時會自動執行。具體代碼如下:
#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(); }