一、概念
特點:
裝飾者和被裝飾者擁有相同的超型別(可能是抽象類也可能是介面);
在裝飾類中包含乙個被裝飾元件類的物件引用;
可以為被裝飾物件新增額外的功能;
在裝飾類中重寫被裝飾元件類中的方法,並對被裝飾元件類中對應的方法呼叫;
因為裝飾者和被裝飾者擁有相同的抽象型別,因此在任何需要原始物件(被包裝)的場合,都可以用裝飾過的物件來替代它;可以用多個裝飾類來包裝乙個物件,裝飾類可以包裝裝飾類或被裝飾物件。簡而言之,裝飾模式保持介面,增強效能;繼承至component同時包含乙個component作為其成員變數(裝飾器模式動機中的動態地增加功能是在這裡實現的)。
二、uml圖表示
component(抽象構建):它是具體構建類和抽象裝飾類的父類。宣告具體構建類的業務方法,它可以使客戶端同等的對待被裝飾類修飾過的類和沒被修飾過的類。實現客戶端的透明操作。
concretecomponent(具體構件類):它實現了抽象構建類的業務方法,裝飾類會給它增加額外的方法。
decorator(裝飾類):它也是抽象構建類的子類,用於給具體構建類新增方法。它維護乙個指向抽象構建物件的引用,通過該引用可以呼叫裝飾之前構建物件的方法,並通過其子類擴充套件該方法,已達到裝飾的目的。
concretedecorator(具體裝飾類):它是抽象裝飾類的子類,負責給構建類新增新的方法。每乙個具體的裝飾類都定義了乙個具體的行為。
三、裝飾模式的具體實現
component
package decoratorpattern;
public abstract class component
concretecomponent
package decoratorpattern;
public class concretecomponent extends component
}
decorator
package decoratorpattern;
public class decorator extends component
@override
public void display()
}
concretedecorator
package decoratorpattern;
public class concretedecorator extends decorator
//重寫方法
public void display()
public void setmymethod()
}
concretedecorator2
package decoratorpattern;
public class concretedecorator2 extends decorator
//重寫display方法
public void display()
public void shou()
}
client
package decoratorpattern;
public class client
}
執行結果:(可以不停的加方法)
四、優缺點
優點:
(1)裝飾模式與繼承關係的目的都是要擴充套件物件的功能,但是裝飾模式可以提供比繼承更多的靈活性。裝飾模式允許系統動態決定「貼上」或者除掉乙個「裝飾」,繼承關係是靜態的,它在系統執行前就決定了;
(2)通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合;
(3)裝飾者類可以在被裝飾者的行為前面或後面加上自己的行為,甚至取代被裝飾者的行為,達到特定的目的;
(4)裝飾者一般對元件的客戶是透明的,除非客戶程式依賴於元件的具體型別
缺點:
由於使用裝飾模式,可以比使用繼承關係需要較少數目的類。使用較少的類,當然使設計比較易於進行。但是,在另一方面,使用裝飾模式會產生比使用繼承關係更多的物件。更多的物件會使得查錯變得困難,特別是這些物件看上去都很相像。
五、適用場景
1)在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責;
2)處理那些可以撤銷的職責;
3)當不能採用生成子類的方式進行擴充時。
六、裝飾器模式與介面卡模式的比較
共同點:都擁有乙個目標物件。裝飾器通過包裝乙個裝飾物件來擴充套件其功能,而又不改變其介面,這實際上是基於物件的介面卡模式的一種變種。
不同點:介面卡模式需要實現另外乙個介面,而裝飾器模式必須實現該物件的介面。介面卡模式主要是為了介面的轉換,而裝飾者模式關注的是通過組合來動態的為被裝飾者注入新的功能或行為(即所謂的責任)。
七、總結
裝飾模式在某些不方便用繼承的時候是非常好用的乙個模式,畢竟不用寫太多的類。但是我建議不要裝飾太多次,因為顯然,如果裝飾太多層,進行排查的時候會非常的麻煩。
參考:
設計模式(五) 裝飾模式
什麼是裝飾模式?裝飾模式 decorator 動態的給乙個物件增加一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。一般而言,當系統需要實現新功能時候,我們會向舊的類中新增新的 以擴充套件其功能。我們將這種行為稱為對主類的裝飾,但這種做法的問題在於,在主類中增加了屬性和方法,從而增加了主類...
(五)設計模式 裝飾模式
動態的給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。人 concretecomponet定義了乙個具體的物件,也可以給這個物件新增職責。服飾 裝飾抽象類,繼承componet,從外類來擴充套件componet類的功能,但對於componet來說,是無需知道decorato...
設計模式(五)裝飾器模式
設計模式專欄 裝飾器模式 decorator pattern 允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。我們通過下面的例項來演示裝...