語言與模式-10裝飾模式

意圖

動態地給一個對象添加一些額外的職責。就增加功能來說,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實現

笑而不語~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章