模板模式
作用:定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟,其關鍵是將通用演算法(邏輯)封裝在抽象基類中,并將不同的演算法細節放到子類中實作,
在我看來,模板模式的好處在于能減少代碼段的復用,把公共行為封裝到基類中,把行為流程的實作函式寫在基類中,這樣在對于不同情況的不同子類,在子類中修改或重寫函式即可,而且子類不必擔心具體流程,
優點: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();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/56840.html
標籤:C++
上一篇:題解 P4850 【[IOI2009]葡萄干raisins】
下一篇:結題報告--洛谷P3915
