Design Pattern 裝飾模式

2021-09-23 16:08:51 字數 1676 閱讀 1744

動態地給乙個物件新增一些額外的職責。就增加功能來說,decorator模式相比生成子類更為靈活。 

對於物件功能的擴充套件, 物件導向一般通過繼承來解決, 但這種方式缺乏靈活性, 而且隨意定義子類容易導致類層次結構過快膨脹. 

場景, 當類的核心職責和主要行為沒有發生變化, 僅僅需要動態對類物件新增一些裝飾性的功能, 比如給人穿衣服...... 

如下圖所示, 只是為圖畫換換邊框, 這種改動只需要使用下面介紹的裝飾模式.

裝飾模式實現, 如下**,

class component    //核心類 

class decorator: component //裝飾類, 必須繼承自核心類, 第一是要保持介面一致, 更重要的是, 這樣可以巢狀裝飾

void operation()

}

客戶**使用, 

com = new component() 

dec = new decorator()

dec.setcomponent(com)

dec.operation() //這個operation就是經過裝飾的

裝飾模式如下圖, 我們可以建立乙個抽象decorator類, 然後根據需要建立許多的concretedecroator類. 而decorator類可以裝飾任意component類. 

而且decorator類只是對核心類物件進行動態裝飾, 不會影響到核心類本身, 所以可以任意裝飾, 加成員變數, 呼叫其他函式, 如concretedecroatora, concretedecroatorb. 

且decorator類本身也是component類, 所以可以巢狀裝飾, 非常的強大, 

com = new component() 

dec_a = new concretedecroatora()

dec_b = new concretedecroatorb()

dec_c = new concretedecroatorc()

dec_a.setcomponent(com)

dec_b.setcomponent(dec_a)

dec_c.setcomponent(dec_b)

dec_c.operation() //這個operation就是經過多次裝飾的

裝飾模式的好處,

首先, 有效的將類的核心職能和裝飾功能區分開了, 動態裝飾完全不會影響核心類 便於維護, 可復用性強. 

其次, 有效的解決了子類的快速膨脹的問題, 如果單純用繼承來解決問題, 不但對於裝飾a,b,......各需要子類, 而且對於各種裝飾的組合也需要建立子類. 當裝飾種類很多時, 可想而知那會建立非常多的子類. 而使用裝飾模式, 只需要對每個裝飾生成子類, 而裝飾的組合和搭配只需要巢狀使用裝飾模式就可以達成. 

這個模式還是很實用, 很強大的, 可以用於很多場景......

具體實用例子參考, 

2013-02-05

Design Pattern 裝飾者模式

動態地將責任附加到物件上,若要有擴充套件功能,裝飾者提供了比繼承有彈性的替代方案。咖啡類,可以加調料,計算 讀取當前流中的下乙個位元組 並以整數形式返回 若讀取到檔案結尾則返回 1。public int read throws ioexception 將當前流中的len個位元組讀取到從下標off開始...

Design Pattern 工廠模式

當有一些要例項化的具體類,究竟例項化哪個類,要在執行時由一些條件來決定。當 使用大量具體類時,我們就要考慮使用工廠模式了。定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到子類。public abstract class pizzastore protected ...

design pattern 外觀模式

針對問題 在軟體開發系統中,客戶程式經常會與複雜系統的內部子系統之間產生耦合,而導致客戶程式隨著子系統的變化而變化。那麼如何簡化客戶程式與子系統之間的互動介面?如何將複雜系統的內部子系統與客戶程式之間的依賴解耦?為子系統中的一組介面提供乙個一致的介面,facade 模式定義了乙個高層介面,這個介面使...