1. 程式人生 > 其它 >自學java第二十六天

自學java第二十六天

簡述:

動態的給一個物件新增一些額外的職責,就增加功能來說,相比生成子類更為靈活。

裝飾器(Decorator)模式,是一種在執行期動態給某個物件的例項增加功能的方法。

在IO的Filter模式一節中其實已經講過裝飾器模式了。在Java標準庫中。InputStream時抽象類。FileInputStream、ServletInputStream、Socket.getInputStream()這些InputStream都是最終資料來源。

現在,要給不同的最終資料來源增加緩衝功能,計算簽名功能,加密解密功能,那麼,3個最終資料來源,3種功能一共需要9個子類。如果繼續增加最終資料來源,或者增加新功能,子類會爆炸式的增長,這種設計方式顯然是不可取的。

Docorator模式的目的就是把一個一個的附加功能,用Docotor的方式給一層一層的加到原始的資料來源上,最終,通過組合獲得我們想要的功能。

例如:給FileInputStream增加緩衝和解壓壓縮功能,用Docorator模式寫醋回來如下:

InputStream fis =new FileInputStream("test.gz");//建立原始資料來源
InputStream bis=new BufferedInputStream(fis);//增加緩衝功能
InputSream gis=new GZIPInpitStream(bis);//增加解壓縮功能

或者一次性寫為這樣:

InputStream input=new
GZIPInputStream( new BufferedInputStream( new FileInputStream("test.gz"
) ) ) ;

觀察BufferedInputStream和GZIPInputStream。它們實際上都是從FilterInputStream繼承的,這個FilterInputStream就是一個抽象的Decorator。我們用圖把Decorator模式畫出來如下:

最頂層的Component是介面,對應到IO的就是InputStream這個抽象類。ComponentA,ComponentB是實際的子類,對應到IO的就是FileInputStream、ServletInputStream這些資料來源。Decorator是用於實現各個符駕功能的抽象裝飾器,對應到IO的就是FilterInputStream。而Docorator派生的就是一個一個的裝飾器,它們每個都有獨立的功能,對應到IO的就是BufferedInputStream,GZIPInputStream等。

Decorator模式有什麼好處呢?它實際上把核心功能和附加功能給分開了。核心功能指FileInputStream這些真正讀資料的源頭,附加功能指加緩衝、壓縮、解密這些功能。如果我們要新增核心功能,就增加Component的子類,例如ByteInputStream。如果我們要增加附加功能,就增加Decorator的子類,例如CipherInputStream。兩部分都可以獨立地擴充套件,而具體如何附加功能,由呼叫方自由組合,從而極大地增強了靈活性。

如果我們要自己設計完整的Decorator模式,應該如何設計?