孫悟空有七十二般變化,他的每一種變化都給他帶來一種附加本領。而不管孫悟空怎麼變化在二郎神眼裡,他永遠是那隻猢猻。
裝飾器模式以對客戶透明的方式動態給一個對象附加上更多的責任。
在孫悟空的例子裡,老孫變成的魚兒相當於老孫的子類。
裝飾模式的類圖如下:
裝飾模式的角色介紹:
抽象構件角色(ComponentDec):給出一個抽象介面,以規範準備接收附加責任的對象
具體構件(Concrete ComponentDec):定義一個將要接收附加責任的類
裝飾角色(Decortor):持有一個構件對象的執行個體,並頂一個與抽象構件介面一致的介面
具體裝飾(Concrete Decorator):負責給構件對象“貼上”附加的責任
public interface Component { void simpleOperation();} public class Decorator implements Component { private Component component; public Decorator(Component component) { super(); this.component = component; } public Decorator() { super(); } /** * 商業方法,委派給構件 */ public void simpleOperation() { component.simpleOperation(); }}
1、上面的修飾類中有一個私人的屬性Component,其資料類型是構件類型
2、此裝飾類實現了構件介面
3、介面的實現方法也值得注意,每一個實現的方法都委派給父類,當並不是單純的委派,而是有功能的增強。
雖然Decorator類不是一個抽象類別,但是由於他的功能是一個抽象角色,因此也常常稱它為抽象修飾。
public class ConcreteComponent implements Component { public ConcreteComponent() { super(); } /** * 商業方法 */ public void simpleOperation() { }} public class ConcreteDecorator extends Decorator { public void simpleOperation(){ super.simpleOperation(); }}
齊天大聖的例子:
Component的角色便是大名鼎鼎的齊天大聖孫悟空扮演的;ConcreteComponent的角色屬於大聖的本尊,就是猢猻本人;大聖的72變便是Decorator角色;而ConcreteDecorator便是花、鳥、魚、蟲等72般變化。
裝飾模式應該在什麼情況下使用。
1、需要擴充一個類的功能,或給一個類增加附加功能
2、需要動態給一個對象增加功能,這些功能可以再動態撤銷
3、需要增加由一些準系統的排列組合而產生的非常大量的功能,從而使得繼承關係不現實
裝飾模式的優缺點
優點:
1、與繼承關係目的都是要擴充項物件的功能,但裝飾模式可以提供比繼承更多的靈活性
裝飾模式允許系統動態決定貼上一個需要的裝飾,或者除掉一個不需要的裝飾。繼承關係則不同,繼承關係是靜態,他在系統運行前就已經決定了。
2、通過使用不同的具體修飾類及這些裝飾類的排列組合,設計師可以創造出很多不同的行為組合。而繼承沒有這個關係優勢。每一種不同的組合均需要事先通過子類繼承的方式設計好。
3、這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加容易出錯
缺點
使用裝飾模式會產生比使用繼承關係更多的類。特別是這些類看上去都比較相近