Java設計模式--裝飾器模式到Java IO 流

裝飾器模式

抽象構件角色:給出一個抽象接口,以規範準備接受附加責任的對象。數組

具體構件角色:定義準備接受附加責任的對象。緩存

抽象裝飾角色:持有一個構件對象的實例,並對應一個與抽象構件接口一致的接口。ide

具體裝飾角色:負責給具體構件加上額外的責任。性能

何時使用:測試

1. 須要擴展一個類的功能,或者給一個類增長附加責任。this

2. 須要動態的給一個對象增長功能,這些功能能夠再動態的撤銷。spa

3. 須要增長由一些基本功能的排列組合而產生的的大量的功能,從而使繼承關係變得不現實。3d

我以給汽車換顏色爲例:code

汽車廠生產汽車實例,4S店能夠噴漆換顏色。對象

Car接口:

/** * Created by 001977 on 2019-04-12 11:39. * 抽象構件角色 */
public interface Car { /** * 出廠車身顏色 */
    void skin(); }

 

具體構件卡羅拉:

/** * Created by 001977 on 2019-04-12 11:42. * 具體構件:COROLLA卡羅拉(灰色) */
public class Corolla implements Car { @Override public void skin() { System.out.println("超級無敵灰色"); } }

 

4S店抽象裝飾器:

/** * Created by 001977 on 2019-04-12 11:45. * 抽象裝飾角色(4S店) */
public abstract class FourS implements Car { private Car car; public FourS(Car car) { this.car = car; } @Override public void skin() { car.skin(); } }

 

具體裝飾器:噴槍紅

/** * Created by 001977 on 2019-04-12 11:49. * 具體裝飾角色(紅色噴漆) */
public class RedSprayPaint extends FourS { public RedSprayPaint(Car car) { super(car); } @Override public void skin() { super.skin(); System.out.println("花2000塊錢噴紅色的漆"); } }

 

具體裝飾器:噴槍白

/** * Created by 001977 on 2019-04-12 11:49. * 具體裝飾角色(白色噴漆) */
public class WhiteSprayPaint extends FourS { public WhiteSprayPaint(Car car) { super(car); } @Override public void skin() { super.skin(); System.out.println("花1000塊錢噴白色的漆"); } }

 

測試運行:

public class Main { public static void main(String[] args) throws IOException { System.out.println("====================出廠顏色===================="); Car corolla = new Corolla(); corolla.skin(); System.out.println("====================換顏色===================="); RedSprayPaint red = new RedSprayPaint(new WhiteSprayPaint(corolla)); red.skin(); } }

 

 

IO中的體現(以InputStream爲例)

抽象構件角色:由InputStream扮演,這個抽象類爲各類子類型流處理器提供統一的接口。

具體構件角色:由FileInputStream、ObjectInputStream 、ByteArrayInputStream 等原始流處理器扮演,他們實現了InputStream的接口,能夠被裝飾器裝飾。

抽象裝飾角色:由FilterInputStream扮演,他也實現了InputStream的接口。

具體裝飾角色:由DataInputStream 、BufferedInputStream等扮演。

..

因爲IO庫中須要不少性能的各類組合,若是用繼承方法實現,那麼每一種組合都須要一個類,這樣會形成大量性能重複的類出現。若是使用裝飾器模式,那麼類的數目大大減小,性能的重複也減到最少。所以裝飾器模式是IO中的基本模式。

以InputStream【抽象構件】爲例:上圖中的流能夠分爲兩類:原始流處理器【具體構件】(FileInputStream及其左邊的類)和連接流處理器【裝飾器】(實現FilterInputStream的類【具體裝飾器】)。

首先InputStream定義了一些規範:

接着好比FileInputStream去實現,實際上它都是去調用本地方法的,請看:

而後裝飾器也去實現InputStream的方法,關鍵是持有InputStream對象的實例

 

最後具體的裝飾器好比:

BufferedInputStream裝飾了InputStream的內部工做方式,使得流的讀入操做使用緩衝機制,不會對每一次流讀入的操做都產生一次物理讀盤動做,從而提升了程序的效率。它的內部有個buf字節數組用來緩存數據。

讀取的時候調用fill方法,簡單來講就是先嚐試獲取緩衝區,而後再操做輸入流將數據讀入緩衝區,這期間還有一些細節好比調整pos再也不贅述。

還有DataInputStream提供了一些直接讀取某種類型的數據的方法,省的咱們讀取完再去作轉換。

好比:readBoolean

它的讀入操做read方法就是直接調用原始流處理器的方法,並不複雜

 最後附上一張畫了一天的IO繼承關係圖:

 若是圖片看不清,鼠標右鍵---在新標籤頁下打開圖片

相關文章
相關標籤/搜索