裝飾者模式
意圖:動態地給乙個物件新增一些額外的職責。就增加功能來說,decorator模式相比生成子類更為靈活。
設計原則:
1. 多用組合,少用繼承。
利用繼承設計子類的行為,是在編譯時靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴充套件物件的行為,就可以在執行時動態地進行擴充套件。
2. 類應設計的對擴充套件開放,對修改關閉。
要點:
1. 裝飾者和被裝飾物件有相同的超型別。
2. 可以用乙個或多個裝飾者包裝乙個物件。
3. 裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。
4. 物件可以在任何時候被裝飾,所以可以在執行時動態的,不限量的用你喜歡的裝飾者來裝飾物件。
5. 裝飾模式中使用繼承的關鍵是想達到裝飾者和被裝飾物件的型別匹配,而不是獲得其行為。
6. 裝飾者一般對元件的客戶是透明的,除非客戶程式依賴於元件的具體型別。在實際專案中可以根據需要為裝飾者新增新的行為,做到「半透明」裝飾者。
7. 介面卡模式的用意是改變物件的介面而不一定改變物件的效能,而裝飾模式的用意是保持介面並增加物件的職責。
裝飾者就像新增和脫下衣服一樣搭配你想要的衣服,最後滿意的穿著自己的衣服,一展芳容
下面是c++原始碼
有興趣的人可以拿來參考
#include
#include
#include
#include
#include
#include
#include
using namespace std;
//enum condiment;
class beverage
void setsize(int size)
virtual string getdescription()
virtual double cost()=0;
};class espresso :public beverage
double cost()
};class houseblend:public beverage
double cost()
};class darkrost:public beverage
double cost()
};class decat:public beverage
double cost()
};class condimentdecorator:public beverage
;class mocha:public condimentdecorator
string getdescription()
double cost()
};class whip:public condimentdecorator
string getdescription()
double cost()
};class soy:public condimentdecorator
string getdescription()
int getsize()
double cost()
else if(getsize()==1)
else
return cost;}};
class dictionary
//getline 函式用法遇到,號時停止,並把ss中的字串寫到s中
sort(l.begin()+1,l.end());
string r;
for(vector::iterator it=l.begin();it!=l.end();it++)
r+=*it;
}return r;}};
int main()
裝飾者模式
裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...
裝飾者模式
裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...
裝飾者模式
裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...