本篇文章轉載自http://c.biancheng.net/view/1366.htmlhtml
裝飾模式比較簡單,我就不單獨寫實現例子了。參考設計圖去實現不是什麼問題。建議能夠寫一寫找找感受。java
在現實生活中,經常須要對現有產品增長新的功能或美化其外觀,如房子裝修、相片加相框等。在軟件開發過程當中,有時想用一些現存的組件。這些組件可能只是完成了一些核心功能。但在不改變其結構的狀況下,能夠動態地擴展其功能。全部這些均可以釆用裝飾模式來實現。this
裝飾(Decorator)模式的定義:指在不改變現有對象結構的狀況下,動態地給該對象增長一些職責(即增長其額外功能)的模式,它屬於對象結構型模式。.net
裝飾(Decorator)模式的主要優勢有:設計
其主要缺點是:裝飾模式增長了許多子類,若是過分使用會使程序變得很複雜。code
一般狀況下,擴展一個類的功能會使用繼承方式來實現。但繼承具備靜態特徵,耦合度高,而且隨着擴展功能的增多,子類會很膨脹。若是使用組合關係來建立一個包裝對象(即裝飾對象)來包裹真實對象,並在保持真實對象的類結構不變的前提下,爲其提供額外的功能,這就是裝飾模式的目標。下面來分析其基本結構和實現方法。component
裝飾模式主要包含如下角色。htm
裝飾模式的結構圖如圖 1 所示。對象
裝飾模式的實現代碼以下:blog
package decorator; public class DecoratorPattern { public static void main(String[] args) { Component p=new ConcreteComponent(); p.operation(); System.out.println("---------------------------------"); Component d=new ConcreteDecorator(p); d.operation(); } } //抽象構件角色 interface Component { public void operation(); } //具體構件角色 class ConcreteComponent implements Component { public ConcreteComponent() { System.out.println("建立具體構件角色"); } public void operation() { System.out.println("調用具體構件角色的方法operation()"); } } //抽象裝飾角色 class Decorator implements Component { private Component component; public Decorator(Component component) { this.component=component; } public void operation() { component.operation(); } } //具體裝飾角色 class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } public void operation() { super.operation(); addedFunction(); } public void addedFunction() { System.out.println("爲具體構件角色增長額外的功能addedFunction()"); } }
程序運行結果以下:
建立具體構件角色 調用具體構件角色的方法operation() --------------------------------- 調用具體構件角色的方法operation() 爲具體構件角色增長額外的功能addedFunction()
前面講解了關於裝飾模式的結構與特色,下面介紹其適用的應用場景,裝飾模式一般在如下幾種狀況使用。
裝飾模式在 Java 語言中的最著名的應用莫過於 Java I/O 標準庫的設計了。例如,InputStream 的子類 FilterInputStream,OutputStream 的子類 FilterOutputStream,Reader 的子類 BufferedReader 以及 FilterReader,還有 Writer 的子類 BufferedWriter、FilterWriter 以及 PrintWriter 等,它們都是抽象裝飾類。
下面代碼是爲 FileReader 增長緩衝區而採用的裝飾類 BufferedReader 的例子:
BufferedReader in=new BufferedReader(new FileReader("filename.txt")); String s=in.readLine();
裝飾模式所包含的 4 個角色不是任什麼時候候都要存在的,在有些應用環境下模式是能夠簡化的,如如下兩種狀況。
(1) 若是隻有一個具體構件而沒有抽象構件時,可讓抽象裝飾繼承具體構件,其結構圖如圖 4 所示。
圖4 只有一個具體構件的裝飾模式
(2) 若是隻有一個具體裝飾時,能夠將抽象裝飾和具體裝飾合併,其結構圖如圖 5 所示。
圖5 只有一個具體裝飾的裝飾模式