裝飾者模式

2021-09-22 22:39:48 字數 1481 閱讀 5923

裝飾者模式動態的對物件進行擴充套件(如:功能的擴充套件附加等),裝飾者模式比繼承更加靈活,可以靈活的擴充套件組合。其實際應用時,裝飾者類中包含被裝飾者的引用或指標,這樣的逐層巢狀過程便是裝飾的過程(即功能擴充套件的過程)。

比如:要實現一組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 ...