一、OIO
1、一些細節
1)傳統的IO是面向,流,的
2)流在底層輸入與輸出都是傳輸的字節,字符流只是上層的封裝
3)OIO中流要麼是輸入流,要麼是輸出流,不可能即是輸入流又是輸出流
2、流的分類
分類方式1:輸入流、輸出流
輸入、輸出是相對於應用程序來說的,應用程序向外傳遞數據爲輸出,外部嚮應用程序傳遞數據爲輸入
分類方式2:節點流、過濾流
節點流:從特定的地方讀寫的流,例如:磁盤或一塊內存區域
過濾流:使用節點流作爲輸入或輸出,過濾流是使用一個已經存在的輸入流或輸出流連接創建的,過濾流一定是依賴一個節點流的
3、java.io包中InputStream/OutputStream的類層次
其中藍色爲節點流、紫色爲過濾流
4、java.io包中Reader/Writer的類層次
5、OIO流的創建包裝過程體現的設計模式:裝飾器模式
裝飾模式說明
裝飾器模式擴展的是:對象功能、動態的
繼承 擴展的是:類的功能、靜態的
- 裝飾模式以對客戶(使用這個對象的一方)透明的方式動態的給一個對象附加上更多的功能,客戶端並不會覺得對象在裝飾前和裝飾後有什麼不同。
- 裝飾模式可以在不創建更多子類的情況下,將對象的功能加以擴展。
- 裝飾模式把客戶端的調用,委派到被裝飾類。裝飾模式的關鍵在於這種擴展完全是透明的。
- 裝飾模式是在不必改變原類文件和使用繼承的情況下,動態擴展一個對象的功能。他是通過創建一個包裝對象,也就是裝飾來包裹真實的對象
裝飾模式的角色
1、抽象構件角色(Component):給出一個抽象接口,以規範準備接收附加責任的對象。
- OIO中對應InputStream
2、具體構件角色(Concrete Component):定義一個將要接收附加責任的類
- OIO中對應FileInputStream
3、裝飾角色(Decorator):持有一個構件對象的引用,並定義一個與抽象構件接口一致的接口
- OIO中對應FilterInputStream
4、具體裝飾角色(Concrete Decorator):負責給構件對象貼上附加的責任(功能)。
- OIO中對應BufferedInputStream
裝飾模式的特點
- 裝飾對象和真實對象有相同的接口。這樣客戶端對象就可以以和真實對象相同的方式調用裝飾對象。
- 裝飾對象包含了一個真實對象的引用
- 裝飾對象接收所有來自客戶端請求,把請求轉發給真實對象
- 裝飾對象可以在轉發前 或者 後,增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構,就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。
舉例:
其他角色略。
具體裝飾角色:
客戶端調用:
裝飾模式與繼承比較
裝飾模式 | 繼承 |
|
|
裝飾模式的適用場景
- 想要透明並且動態的給對象增加新的功能而又不會影響其他對象
- 給對象增加的功能,在未來可能會發生改變
- 用子類(繼承)擴展功能不實際的情況下
Jdk IO庫使用裝飾器模式帶來的好處
- 即滿足IO體系對輸入輸出流增加功能的要求
- 在運行期動態增加功能,避免繼承方式會造成的類的數量龐大
二、NIO