裝飾模式又名包裝(Wrapper)模式
裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關系的一個替代方案
裝飾模式以對客戶透明的方式動態的給一個對象附加上更多的責任。換言之,客戶端并不會覺得對象在裝飾前和裝飾后有什么不同。
裝飾模式可以在不創造更多子類的情況下,將對象的功能加以擴展。
裝飾模式把客戶端的調用委派到被裝飾類。裝飾模式的關鍵在于這種擴展完全是透明的。
裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
裝飾模式的特點:
裝飾對象和真實對象有相同的接口。這樣客戶端對象就可以以和真實對象相同的方式和裝飾對象交互。
裝飾對象包含一個真實對象的引用(reference)
裝飾對象接收所有來自客戶端的請求。它把這些請求轉發給真實的對象。
裝飾對象可以在轉發這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。
裝飾模式與繼承的比較
裝飾模式 繼承
用來擴展特定對象的功能 用來擴展一類對象的功能
不需要子類 需要子類
動態 靜態
運行時分配職責 編譯時分派職責
防止由于子類而導致的復雜和混亂 導致很多子類產生
更多的靈活性 缺乏靈活性
對于一個給定的對象,同時可能有不同的裝飾對象,客戶端可以通過它的需要選擇合適的裝飾對象發送消息。
代碼示例

1 package decorator; 2 /* 3 * 抽象構件角色(Component):給出一個抽象接口,以規范準備接收附加責任的對象。 4 */ 5 public interface Component 6 { 7 public void doSomething(); 8 } 9 10 11 package decorator; 12 /* 13 * 具體構件角色(Concrete Component):定義一個將要接收附加責任的類。 14 */ 15 public class ConcreteComponent implements Component 16 { 17 @Override 18 public void doSomething() 19 { 20 System.out.View Code
新聞熱點
疑難解答