1.意圖 動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。 2.別名 包裝器 Wrapper. 3.動機 給某個對象而不是整個類添加一些功能。一個較為靈活的方式時將組件嵌入另一個對象中。 4.適用性 在不影響其它對象的情況下,以動態、透明的方式給單個對 ...
1.意圖
動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。
2.別名
包裝器 Wrapper.
3.動機
給某個對象而不是整個類添加一些功能。一個較為靈活的方式時將組件嵌入另一個對象中。
4.適用性
- 在不影響其它對象的情況下,以動態、透明的方式給單個對象添加職責。
- 處理那些可以撤銷的職責。
- 當不能採用子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏或類定義不能用於生成子類。
5.結構
6.代碼實例
#include <memory> class Component { public: virtual void Operation()=0; }; class ConcreteComponent : public Component { public: void Operation(); }; class Decorator : public Component { public: virtual void Operation(); void SetComponent(std::shared_ptr<Component> pComponent); protected: std::shared_ptr<Component> m_pComponent; }; class ConcreteDecoratorA : public Decorator { public: void Operation(); void OtherBehavior(); }; class ConcreteDecoratorB : public Decorator { public: void Operation(); void OtherBehavior(); };
#include "Component.h" #include <iostream> void ConcreteComponent::Operation() { std::cout << "ConcreteComponent Operation executed" <<std::endl; } void Decorator::Operation() { m_pComponent->Operation(); } void Decorator::SetComponent(std::shared_ptr<Component> pComponent) { m_pComponent = pComponent; } void ConcreteDecoratorA::Operation() { Decorator::Operation(); OtherBehavior(); } void ConcreteDecoratorA::OtherBehavior() { std::cout<<"ConceteDecoratorA OtherBehavior executed" << std::endl; } void ConcreteDecoratorB::Operation() { Decorator::Operation(); OtherBehavior(); } void ConcreteDecoratorB::OtherBehavior() { std::cout<<"ConcreteDecoratorB OtherBehavior executed" << std::endl; }
#include "Component.h" int main() { std::shared_ptr<Component> pComponent(new ConcreteComponent); std::shared_ptr<Decorator> pDecoratorA(new ConcreteDecoratorA); pDecoratorA->SetComponent(pComponent); pDecoratorA->Operation(); std::shared_ptr<Decorator> pDecoratorB(new ConcreteDecoratorB); pDecoratorB->SetComponent(pComponent); pDecoratorB->Operation(); while(1); }
7.測試結果
8.效果
- 比靜態繼承更靈活 可以添加和分離方法,用裝飾在運行時刻增加和刪除職責。
- 避免在層次結構高層的類有太多的特征
- Decorator與它的Component不一樣 Decorator是一個透明的包裝。如果我們從對象表示的觀點出發,一個被裝飾了的組件與這個組件是有差別的,因此,使用裝飾時不應該依賴對象標識。
- 有許多小對象 有很多看上去很類似的小對象,這些對象僅僅在他們相互連接的方式上有所不同,而不是它們的類或它們的屬性值有所不同。對於瞭解這些系統的人來說,很容易對它們進行定製,但是很難學習這些系統。