意圖:
裝飾模式可在不改變原有對象的行為下,擴展其行為;
提供了比繼承更有彈性的替代方案;
動態地給一個對象添加一些額外的職責;
別名:包裝器(Wrapper)模式
來自Head First
- 裝飾者和被裝飾對象有相同的類型,這樣客戶端對象就可以用和真實對象相同的方式和裝飾對象交互;
- 可用一個或多個裝飾者包裝一個對象;
- 在任何需要原始對象(被包裝)的場合,可用裝飾過的對象代替它(擴展原始對象的行為);
- 裝飾者可在所委托被裝飾者的行為之前或之后,加上裝飾后的行為,以達到目的;
- 對象可在任何時候,被裝飾,所以可以在運行時動態地、不限量的裝飾者來裝飾對象;
6.裝飾對象包含一個真實對象的引用;
示例類圖:
Paste_Image.png
也可以將 被包裝的類,放入 Decorator基類中,并設置成 protected類型的變量,這樣做,其實更好,子類,就不需要維護 wrapped 對象了;
Paste_Image.png
裝飾者模式中的角色
- 被裝飾者抽象(Component):是一個抽象接口,或抽象類,也是該模式中的最元素的對象了;
- 被裝飾者具體實現(ConcreteComponent),也是上圖中的ComponentA;
要裝飾的就是這個具體的實現類,可以有多個,具體實現類,如: java io 體系; - 裝飾者基類(Decorator)可以是一個抽象類,或者類,用來實現被裝飾者抽象(Component)中的方法,實現是通過 Componet 對象的引用來實現的;
- 裝飾者實現,如上圖中的(DecoratorA 與 DecoratorB)是具體的裝飾者類,用來裝飾最基本的類,如:ComponentA;