設計模式-裝飾器模式

裝飾器(Decorator)模式指在不改變現有對象結構的情況下,動態地給該對象增加一些職責(即增加其額外功能)的模式,它屬於對象結構型模式。採用裝飾模式擴展對象的功能比採用繼承方式更加靈活;可以設計出多個不同的具體裝飾類,創造出多個不同行爲的組合。但是裝飾模式增加了許多子類,如果過度使用會使程序變得很複雜。

模式結構

裝飾器模式的角色如下:

  • 頂層接口
  • 被裝飾者
  • 裝飾器抽象類
  • 裝飾器

源碼導讀

裝飾器模式使用的典型就是io流了,前面適配器模式我們說到過io流使用了適配器模式,用於字節流轉換到字符流;裝飾器模式在io流中也是一個很經典的使用。其使用的地方就是給流裝飾上緩存。以輸入流爲例,
BufferedInputStream 就是對FileInputStream的裝飾,我們看一下這段代碼:

    String file = "out.txt";    
    InputStream ins = new FileInputStream(file);
     BufferedInputStream bufin= new BufferedInputStream(ins);
     int b;
     while((b=bufin.read())!=-1){
         System.out.println(Integer.toHexString(b));
    }

BufferedInputStream 源碼:

public class BufferedInputStream extends FilterInputStream {
    
     public BufferedInputStream(InputStream in) {
        this(in, DEFAULT_BUFFER_SIZE);
    }
    ......
    public synchronized int read(byte b[], int off, int len) throws IOException{
        ......
    }
}

它繼承了FilterInputStream,而 FilterInputStream 繼承了 InputStreamFileInputStream也繼承了InputStream 。 所以這裏的角色關係爲 InputStream 是頂層類(接口),FileInputStream 是被裝飾類,BufferedInputStream 是裝飾類。BufferedInputStreamFileInputStreamInputStream繼承過來的方法進行了裝飾,這裏的。FilterInputStream佔據的角色是裝飾器抽象類,但其並不是個抽象類;這並不影響我們對其模式的理解。

最近貨更新的有點少,我會努力
六個核彈

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