設計模式 裝飾器模式

2022-09-11 17:18:16 字數 1611 閱讀 6583

裝飾模式(decorator pattern) :動態地給乙個物件增加一些額外的職責(responsibility),裝飾模式可以在不需要創造更多子類的情況下,將物件的功能加以擴充套件。 與繼承關係相比,關聯關係的主要優勢在於不會破壞類的封裝性,而且繼承是一種耦合度較大的靜態關係,無法在程式執行時動態擴充套件。

裝飾模式包含如下角色:

• component: 抽象構件

• concretecomponent: 具體構件

• decorator: 抽象裝飾類

• concretedecorator: 具體裝飾類

其uml圖如下:

component 是乙個介面或者是抽象類,就是定義我們最核心的物件,也就是最原始的物件。在裝飾模式中,必然有乙個被提取出來最核心、最原始、最基本的介面或抽象類component。 

concretecomponent 這個是最核心、最原始、最基本的介面或抽象類的實現,你要裝飾的就是這個物件。 

decorator 一般是乙個抽象的裝飾類,用於拓展component中的功能。實現介面或者抽象方法,它裡面可不一定有抽象的方法呀,在它的屬性裡必然有乙個 private 變數指向 component。 

concretedecoratora 和 concretedecoratorb 是兩個具體的裝飾類,你要把你最核心的、最原始的、最基本的東西裝飾成什麼。

裝飾模式是對繼承的有力補充,繼承可不是萬能的,繼承可以解決很多實際的問題,但是在一些情況下你要是用繼承就會增加很多子類,靈活性非常的差,也非常難以維護,在這樣的情形下,裝飾模式可以替代繼承。

繼承是靜態的給類增加功能,而裝飾模式則是動態的給增加功能,如果業務臨時變更,基於繼承實現的**很可能就需要修改程式,而裝飾模式就不需要修改**。具有良好的拓展性。

裝飾模式的優點:

• 裝飾模式與繼承關係的目的都是要擴充套件物件的功能,但是裝飾模式可以提供比繼承更多的靈活性。 

• 可以通過一種動態的方式來擴充套件乙個物件的功能,通過配置檔案可以在執行時選擇不同的裝飾器,從而實現不同的行為。

• 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創造出很多不同行為的組合。可以使用多個具體裝飾類來裝飾同一物件,得到功能更為強大的物件。

• 具體構件類與具體裝飾類可以獨立變化,使用者可以根據需要增加新的具體構件類和具體裝飾類,在使用時再對其進行組合,原有**無須改變,符合「開閉原則」。

裝飾模式的應用:

j**a i/o 使用了裝飾者模式來實現。以 inputstream 為例,inputstream 是抽象元件,fileinputstream 是 inputstream 的子類,屬於具體元件,提供了位元組流的輸入操作。filterinputstream 屬於抽象裝飾者,裝飾者用於裝飾元件,為元件提供額外的功能,例如 bufferedinputstream 為 fileinputstream 提供快取的功能。

例項化乙個具有快取功能的位元組流物件時,只需要在 fileinputstream 物件上再套一層 bufferedinputstream 物件即可。

設計模式 裝飾器模式

裝飾器模式 decorator pattern 允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。public inte ce playe...

設計模式 裝飾器模式

裝飾者模式的應用場景 裝飾者模式 decorator pattern 是指在不改變原有物件的基礎之上,將功能附加到物件上,提供了比繼承更有彈性的替代方案 擴充套件原有物件的功能 屬於結構型模式。裝飾者模式在我們生活中應用也比較多如給煎餅加雞蛋 給蛋糕加上一些水果 給房子裝修等,為物件擴充套件一些額外...

設計模式 裝飾器模式

定義 裝飾模式可以動態的給乙個物件增加一些額外的功能 增強功能 相比於繼承,裝飾模式能對不支援繼承的類進行增強 並且比繼承更靈活,不需要生成大量的子類。角色 實現 public abstract class house public abstract void sleep public class ...