設計模式9 裝飾器模式

2021-09-25 03:40:42 字數 1446 閱讀 7489

裝飾器模式(decorator pattern)允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。

這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。

裝飾器模式,從某種角度上說,可能更適合用於對已經成型的業務進行修改的場景,不管是用於動態擴充套件,還是動態移除,裝飾器都能很方便的勝任對物件的修改操作。

另外就是,繼承也可以解決類似問題,但是裝飾器可以更好的擴充套件,因為,我們一般解決的是特定物件的特定行為,而不會對整個物件進行修改,這樣子跟大型重構沒有什麼區別。所以,特定場景的修改,裝飾器來的更快,更簡單,更有效率,沒有必要興師動眾。

可代替繼承。

建立抽象類 - 圖形; 建立具體類 - 圓形、矩形

#include using namespace std;

class shape //基類-圖形

virtual ~shape() {}

virtual void draw() = 0;

};class rectangle: public shape //子類-矩形

};class circle: public shape //子類-圓形

};

second_inte***ce.h建立shape 介面的抽象裝飾類 - 圖形裝飾;建立shape 介面的具體裝飾類 - 紅色裝飾

#include "first_inte***ce.h"

class shapedecorator //基類-圖形裝飾

virtual ~shapedecorator() {}

virtual void draw()

protected:

shape *shape;

};class redshapedecorator: public shapedecorator //子類-紅色裝飾

void setredborder()

void draw()

};

main.cpp例項應用 - 在shape 類的基礎上,通過裝飾類新增功能並不改變其原有結構

#include "second_inte***ce.h"

int main()

執行結果:

draw circle

draw circle

border color: red

draw rectangle

border color: red

設計模式 9 裝飾模式

裝飾模式可以動態向乙個現有的物件新增新的功能,同時又不改變其結構。就增加功能來說,使用繼承的方式生成子類也可以達到目的,但隨著擴充套件功能的不斷增加,子類的數量會快速膨脹,而裝飾模式提供了一種更加靈活的方案。gof對裝飾模式的描述為 attach additional responsibilitie...

設計模式 9 裝飾者模式

動態地將責任附加到物件上,若要擴充套件功能,裝飾者比繼承更有彈性 裝飾者將被裝飾聚合到自己內部,雙方都繼承共同的抽象方法,往往是被裝飾者只需要完成自己的本質工作,裝飾者在整合的被裝飾者功能基礎之上新增自己的邏輯。下面以飲品店咖啡和咖啡配料組合例子作為案例說明 public abstract clas...

設計模式 9 裝飾者模式

說明 給乙個類增加額外的功能,適合使用,stream就是使用裝飾者模式,有了memorystream,filestream,networkstream等。實現 public abstract class car public class baoma car 我要加功能,用裝飾者 public abs...