c 設計模式 裝飾模式

2022-08-20 22:09:11 字數 2719 閱讀 6050

近來學習李建中老師的課程,略有所得,作了一些整理

動機

在某些情況下我們可能會「過度地使用繼承來擴充套件物件的功能」, 由於繼承為型別引入的靜態特質,使得這種擴充套件方式缺乏靈活性; 並且隨著子類的增多(擴充套件功能的增多),各種子類的組合(擴充套件功能的組合)會導致更多子類的膨脹。

如何使「物件功能的擴充套件」能夠根據需要來動態地實現?同時避 免「擴充套件功能的增多」帶來的子類膨脹問題?從而使得任何「功能 擴充套件變化」所導致的影響將為最低?

模式定義

動態(組合)地給乙個物件增加一些額外的職責。就增加功能而言,decorator模式比生成子類(繼承)更為靈活(消除重複** & 減少子類個數)。

——《設計模式》gof

結構

示例

以下設計一系列流操作

分別為檔案流、網路流和記憶體流擴充套件加密、緩衝等功能

//業務操作

class stream

};//主體類

class filestream: public stream

virtual void seek(int position)

virtual void write(char data)

};class networkstream :public stream

virtual void seek(int position)

virtual void write(char data)

};class memorystream :public stream

virtual void seek(int position)

virtual void write(char data)

};//擴充套件操作

class cryptofilestream :public filestream

virtual void seek(int position)

virtual void write(byte data)

};class cryptonetworkstream : :public networkstream

virtual void seek(int position)

virtual void write(byte data)

};class cryptomemorystream : public memorystream

virtual void seek(int position)

virtual void write(byte data)

};

可以看見,像這樣層層繼承下去,子類急劇膨脹,且存在大量重複**。

我們這樣設計

這樣子類的數量大為減少,前者是乘法,這裡是加法,顯而易見。

//業務操作

class stream

};//主體類

class filestream: public stream

virtual void seek(int position)

virtual void write(char data)

};class networkstream :public stream

virtual void seek(int position)

virtual void write(char data)

};class memorystream :public stream

virtual void seek(int position)

virtual void write(char data)

};//擴充套件操作

decoratorstream: public stream

};class cryptostream: public decoratorstream

virtual char read(int number)

virtual void seek(int position)

virtual void write(byte data)

};class bufferedstream : public decoratorstream

//...

};void process()

總結1.通過採用組合而非繼承的手法, decorator模式實現了在執行時 動態擴充套件物件功能的能力,而且可以根據需要擴充套件多個功能。避免了使用繼承帶來的「靈活性差」和「多子類衍生問題」。

2.decorator類在介面上表現為is-a component的繼承關係,即 decorator類繼承了component類所具有的介面。但在實現上又 表現為has-a component的組合關係,即decorator類又使用了 另外乙個component類

3.decorator模式的目的並非解決「多子類衍生的多繼承」問題, decorator模式應用的要點在於解決「主體類在多個方向上的擴充套件 功能」——是為「裝飾」的含義。

c 設計模式 裝飾模式

裝 飾模式又名包裝模式,以對客戶端透明的方式擴充套件物件的功能,是繼承關係的乙個替代方案。它使用原來被裝飾的類的乙個子類的例項,把客戶端的呼叫委派到被裝 飾類,客戶端並不會覺得物件在裝飾前和裝飾後有什麼不同。在以下情況下應使用裝飾模式 需要擴充套件乙個類的功能,或給乙個類增加附加責任。動態地給乙個物...

c 設計模式(裝飾模式)

動態地給乙個物件新增一些額外的職責 不重要的功能,只是偶然一次要執行 就增加功能來說,裝飾模式比生成子類更為靈活。建造過程不穩定,按正確的順序串聯起來進行控制。good 當你向舊的類中新增新 時,一般是為了新增核心職責或主要行為。而當需要加入的僅僅是一些特定情況下才會執行的特定的功能時 簡單點就是不...

C 設計模式 裝飾模式

目錄 基本概念 和例項 裝飾模式是為已有功能動態地新增更多功能的一種方式。當系統需要新功能的時候,是向舊系統的類中新增新 這些新 通常裝飾了原有類的核心職責或主要行為。裝飾模式的優點 1.把類中的裝飾功能從類中搬移出去,這樣可以簡化原有的類 2.有效地把類的核心職責和裝飾功能區分開了。而且可以去除相...