裝飾模式 Decorator裝飾模式比較簡單,我就不單獨寫實現(xiàn)例子了。參考設計圖去實現(xiàn)不是什么問題。建議可以寫一寫找找感覺。 在現(xiàn)實生活中,常常需要對現(xiàn)有產(chǎn)品增加新的功能或美化其外觀,如房子裝修、相片加相框等。在軟件開發(fā)過程中,有時想用一些現(xiàn)存的組件。這些組件可能只是完成了一些核心功能。但在不改變其結(jié)構的情況下,可以動態(tài)地擴展其功能。所有這些都可以釆用裝飾模式來實現(xiàn)。 裝飾模式的定義與特點裝飾(Decorator)模式的定義:指在不改變現(xiàn)有對象結(jié)構的情況下,動態(tài)地給該對象增加一些職責(即增加其額外功能)的模式,它屬于對象結(jié)構型模式。 裝飾(Decorator)模式的主要優(yōu)點有:
其主要缺點是:裝飾模式增加了許多子類,如果過度使用會使程序變得很復雜。 裝飾模式的結(jié)構與實現(xiàn)通常情況下,擴展一個類的功能會使用繼承方式來實現(xiàn)。但繼承具有靜態(tài)特征,耦合度高,并且隨著擴展功能的增多,子類會很膨脹。如果使用組合關系來創(chuàng)建一個包裝對象(即裝飾對象)來包裹真實對象,并在保持真實對象的類結(jié)構不變的前提下,為其提供額外的功能,這就是裝飾模式的目標。下面來分析其基本結(jié)構和實現(xiàn)方法。 1. 模式的結(jié)構裝飾模式主要包含以下角色。
裝飾模式的結(jié)構圖如圖 1 所示。 2. 模式的實現(xiàn)裝飾模式的實現(xiàn)代碼如下: 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("創(chuàng)建具體構件角色"); } public void operation() { System.out.println("調(diào)用具體構件角色的方法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()"); } } 程序運行結(jié)果如下: 創(chuàng)建具體構件角色 調(diào)用具體構件角色的方法operation() --------------------------------- 調(diào)用具體構件角色的方法operation() 為具體構件角色增加額外的功能addedFunction() 裝飾模式的應用場景前面講解了關于裝飾模式的結(jié)構與特點,下面介紹其適用的應用場景,裝飾模式通常在以下幾種情況使用。
裝飾模式在 Java 語言中的最著名的應用莫過于 Java I/O 標準庫的設計了。例如,InputStream 的子類 FilterInputStream,OutputStream 的子類 FilterOutputStream,Reader 的子類 BufferedReader 以及 FilterReader,還有 Writer 的子類 BufferedWriter、FilterWriter 以及 PrintWriter 等,它們都是抽象裝飾類。 下面代碼是為 FileReader 增加緩沖區(qū)而采用的裝飾類 BufferedReader 的例子: BufferedReader in=new BufferedReader(new FileReader("filename.txt")); String s=in.readLine(); 裝飾模式的擴展裝飾模式所包含的 4 個角色不是任何時候都要存在的,在有些應用環(huán)境下模式是可以簡化的,如以下兩種情況。 (1) 如果只有一個具體構件而沒有抽象構件時,可以讓抽象裝飾繼承具體構件,其結(jié)構圖如圖 4 所示。
(2) 如果只有一個具體裝飾時,可以將抽象裝飾和具體裝飾合并,其結(jié)構圖如圖 5 所示。
|
|