1. 程式人生 > >結構型模式之 裝飾模式

結構型模式之 裝飾模式

res 松耦合 行為 父類 添加 class 但是 end bsp

裝飾模式(Decorator Pattern) :動態地給一個對象增加一些額外的職責(Responsibility),就增加對象功能來說,裝飾模式比生成子類實現更為靈活。其別名也可以稱為包裝器(Wrapper),與適配器模式的別名相同,但它們適用於不同的場合。根據翻譯的不同,裝飾模式也有人稱之為“油漆工模式”,它是一種對象結構型模式。

一般有兩種方式可以實現給一個類或對象增加行為:

  • 繼承機制,使用繼承機制是給現有類添加功能的一種有效途徑,通過繼承一個現有類可以使得子類在擁有自身方法的同時還擁有父類的方法。但是這種方法是靜態的,用戶不能控制增加行為的方式和時機。
  • 關聯機制,即將一個類的對象嵌入另一個對象中,由另一個對象來決定是否調用嵌入對象的行為以便擴展自己的行為,我們稱這個嵌入的對象為裝飾器(Decorator)

裝飾模式以對客戶透明的方式動態地給一個對象附加上更多的責任,換言之,客戶端並不會覺得對象在裝飾前和裝飾後有什麽不同。裝飾模式可以在不需要創造更多子類的情況下,將對象的功能加以擴展。這就是裝飾模式的模式動機。

模式分析:

  • 與繼承關系相比,關聯關系的主要優勢在於不會破壞類的封裝性,而且繼承是一種耦合度較大的靜態關系,無法在程序運行時動態擴展。在軟件開發階段,關聯關系雖然不會比繼承關系減少編碼量,但是到了軟件維護階段,由於關聯關系使系統具有較好的松耦合性,因此使得系統更加容易維護。當然,關聯關系的缺點是比繼承關系要創建更多的對象。
  • 使用裝飾模式來實現擴展比繼承更加靈活,它以對客戶透明的方式動態地給一個對象附加更多的責任。裝飾模式可以在不需要創造更多子類的情況下,將對象的功能加以擴展。

例子同樣來自菜鳥教程

我們將創建一個 Shape 接口和實現了 Shape 接口的實體類。然後我們創建一個實現了 Shape 接口的抽象裝飾類 ShapeDecorator,並把 Shape 對象作為它的實例變量。

RedShapeDecorator 是實現了 ShapeDecorator 的實體類。

DecoratorPatternDemo,我們的演示類使用 RedShapeDecorator 來裝飾 Shape 對象。

//步驟一 創建一個接口
class Shape 
{
public:
    virtual void draw() {}
};
//步驟二 創建實現接口的實體類
class
Rectangle: public Shape { public: void draw() { std::cout << "Shape: Rectangle" << std::endl; } }; class Circle : public Shape { public: void draw() { std::cout << "Shape: Circle" << std::endl; } }; //步驟 3 創建實現了 Shape 接口的抽象裝飾類 class ShapeDecorator : public Shape { public: Shape* decoratedShape; public: ShapeDecorator() { decoratedShape = NULL; } ShapeDecorator(Shape * decoratorshape) { decoratedShape = decoratorshape; //decoratorshape->draw(); } void draw() { decoratedShape->draw(); } }; //步驟 4創建擴展了 ShapeDecorator 類的實體裝飾類 class RedShapDecort : public ShapeDecorator { public: //RedShapDecort(Shape* decortShape) :ShapeDecorator(decortShape) {} RedShapDecort() {} RedShapDecort(Shape* decortShape) { decoratedShape = decortShape; } void draw() { decoratedShape->draw(); setRedBorder(decoratedShape); } private: void setRedBorder(Shape* s1) { cout << "Border color :Red " << endl; } }; int main() { Circle circle; Shape * shape1 = &circle; shape1->draw(); RedShapDecort s1(&circle); Shape * redCircle = &s1; redCircle->draw(); Rectangle rect; RedShapDecort s2(&rect); Shape* Rect = &s2; Rect->draw(); return 0; }

結構型模式之 裝飾模式