裝飾者模式動態的對物件進行擴充套件(如:功能的擴充套件附加等),裝飾者模式比繼承更加靈活,可以靈活的擴充套件組合。其實際應用時,裝飾者類中包含被裝飾者的引用或指標,這樣的逐層巢狀過程便是裝飾的過程(即功能擴充套件的過程)。
比如:要實現一組io功能類,要求可以選擇有無緩衝,字元轉換(如大小寫轉換),字元過濾等等功能,這些功能不僅可以靈活組合,而且之後功能還可能不斷增加。若每多一種組合或每增加一種功能都要修改現有類,那麼明顯不符合「對修改關閉,對擴充套件開發」的原則。
為了解決這個問題可以採用裝飾者模式,我們將有無緩衝的兩種基本io型別,而其它功能分別做為裝飾者類。其實現與結構圖如下:
// io基類
#include class iobasestream
~iobasestream() {}
virtual int read(char* buf) = 0;
virtual int write(char* data, size_t datalen) = 0;
};// 有無緩衝io類
class bufferiostream : public iobasestream
~bufferiostream() {}
virtual int read(char* buf)
virtual int write(char* data, size_t datalen)
};class nobufferiostream : public iobasestream
~nobufferiostream() {}
virtual int read(char* buf)
virtual int write(char* data, size_t datalen)
};// 裝飾者基類
#include "iobasestream.h"
class iodecorator : public iobasestream
~iodecorator() {}
virtual int read(char* buf) = 0;
virtual int write(char* data, size_t datalen) = 0;
protected:
iobasestream* _ioptr;
};// 轉換小寫裝飾類
class lowercaseiostream : public iodecorator
~lowercaseiostream() {}
virtual int read(char* buf)
virtual int write(char* data, size_t datalen)
};// 使用舉例
#include "bufferiostream.h"
#include "nobufferiostream.h"
#include "lowercaseiostream.h"
int main()
裝飾者模式
裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...
裝飾者模式
裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...
裝飾者模式
裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...