意圖
動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更爲靈活。
適用性
- 在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。
- 處理那些可以撤消的職責。
- 當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,爲支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因爲類定義被隱藏,或類定義不能用於生成子類。
Java實現
JavaIO庫的使用可能如下
BufferedInputStream bi = new BufferedInputStream(new FileInputStream(filename));
我們都知道FileInputStream是用來讀取文件的,BufferedInputStream是提供了緩存的能力。我們分別看下他們的源代碼
public class BufferedInputStream extends FilterInputStream
...
public class FilterInputStream extends InputStream
...
public class FileInputStream extends InputStream
...
BufferedInputStream繼承了FilterInputStream,FilterInputStream和FileInputStream一樣都繼承自InputStream.
可以看出InputStream是公共父類。
FilterInputStream是裝飾類的公共父類,看看FilterInputStream的源代碼就知道了,他只是做了簡單的方法委託。
BufferedInputStream繼承了FilterInputStream,並添加了緩存的方法(其實就是用一個字節數組保存字節,一次性讀出)。
Clojure實現
笑而不語~