IO流中的设计模式
文章目錄
- 一、裝飾器模式
- Decorator裝飾器:
- 代碼實現
- 裝飾器特點
- 裝飾器在IO流中的使用
- 總結:
- 適配器模式
- Adapter適配器
- 代碼實例
- 適配器特點
- 適配器優缺點
- 適配器在IO中的使用
一、裝飾器模式
Decorator裝飾器:
裝飾模式是在不必改變原類文件和不使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
注意其中的幾點:
? 不改變原類文件
? 不使用繼承
? 動態擴展
Component:
為統一接口,也是裝飾類和被裝飾類的基本類型。
ConcreteComponent:
為具體實現類,也是被裝飾類,他本身是個具有一些功能的完整的類。
Decorator:
是裝飾類,實現了Component接口的同時還在內部維護了一個ConcreteComponent的實例,并可以通過構造函數初始化。而Decorator本身,通常采用默認實現,他的存在僅僅是一個聲明:我要生產出一些用于裝飾的子類了。而其子類才是賦有具體裝飾效果的裝飾產品類。
ConcreteDecorator:
是具體的裝飾產品類,每一種裝飾產品都具有特定的裝飾效果。可以通過構造器聲明裝飾哪種類型的ConcreteComponent,從而對其進行裝飾。
代碼實現
/*** 是裝飾類和被裝飾類的基礎,統一的接口*/ public interface Component {public void method(); } /*** 被裝飾類 是Component接口的具體實現*/ public class ConctreteComponent implements Component {@Overridepublic void method() {System.out.println("ConctreteComponent ...");} } /*** 裝飾類* 實現了Component接口*/ public abstract class Decorator implements Component {//內存維護了一個Component實例private Component component;//通過構造函數來實例化內存的component屬性public Decorator(Component component) {this.component = component;}@Overridepublic void method() {component.method();} } /*** 具體的裝飾類A*/ public class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component component) {super(component);}public void methodA() {System.out.println("裝飾器A提供的新的功能");}@Overridepublic void method() {System.out.println("針對該方法添加一層包裝");super.method();System.out.println("A包裝結束");} }裝飾器特點
它必須持有一個被裝飾的對象(作為成員變量)。
它必須擁有與被裝飾對象相同的接口(多態調用、擴展需要)
它可以給被裝飾對象添加額外的功能。
總結:保持接口,動態增強性能。
裝飾器在IO流中的使用
/*** Inputstream相當于統一的接口,給被裝飾類和裝飾類的基本的類型* FileInputStream相當于原始的被封裝的對象,為具體的實現類,他對inputstream方法有完整的實現*/FileInputStream inputStream = new FileInputStream(path);/*** FilterInputStream是裝飾類,其繼承自InputStream基類* 內部存在一個InputStream實例,需要通過構造函數來實例化內部屬性* /FilterInputStream extends InputStream {protected volatile InputStream in;/*** BufferInputStream就是具體的裝飾類 */BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); InputStream是被裝飾類和裝飾類的基本類型,這里是通過抽象類的形式提供的,相當于Component接口 FileInputStream是具體的被裝飾類,是繼承自InputStream,提供了完備的InputStream 方法的實現。相當于是concreateComponent類 FilterInputStream是裝飾器類,其繼承InpuStream,內部維護了一個Inpustream實現類,相當于Decorator類 BufferInputstream是具體的裝飾器類,繼承自FilterInputStream裝飾器類,提供了具有特有的緩沖功能的特點總結:
裝飾器模式就是一個可以非常靈活的動態擴展類功能的設計模式,它采用組合的方式取代繼承,使得各個功能的擴展更加獨立和靈活。
適配器模式
Adapter適配器
適配器定義:將一個類的接口轉換成客戶希望的另外一個接口,Adapter模式使原本由于接口不兼容而不能一起工作的哪些類可以一起工作
適配器模式分兩種:類適配器和對象適配器
? 使用繼承(就是所謂的類適配器模式)
? 使用組合(所謂的對象適配器模式)
適配器所涉及的角色有:
Target(目標接口):所要轉換的所期待的接口
Adaptee(源角色):需要適配的類
Adapter(適配器):將源角色適配成目標接口,一般持有源接口的引用(或者繼承源接口),且實現目標接口。
Client(客戶類):通過目標角色獲取服務
代碼實例
手機充電器適配:
存在一個Typec接口的充電器,期望提供一個USB接口的充電器
適配器特點
?優點
1、適配器對象實現原有接口
2、適配器對象組合一個實現新接口的對象(這個對象也可以不實現一個接口,只是一個單純的對象)
3、對適配器原有接口方法的調用被委托給新接口的實例的特定方法(重寫舊接口方法來調用新接口功能。)
? 缺點
過多使用適配器會使得系統非常凌亂,明明調用的是A接口,內部卻被適配成了B接口。因此除非必要,不推薦使用適配器,而是直接對系統重構
適配器優缺點
? 優點
有更好的復用性。系統需要使用現有的類,但此類接口不符合系統需要,通過適配器模式讓這些功能得到很好的復用
有更好的擴展性。實現適配器,可以調用自己開發的功能
適用場景
軟件系統結構需要升級或擴展,又不想影響原有系統穩定運行的時候
轉換類之間的差別不是很大的時候
想創建一個可以復用的類,該類可以與其他不相關類或不可預見類協同工作的時候
適配器在IO中的使用
在IO中適配器的使用也比較廣泛
適配器角色就是InputStreamReader,
被適配的角色是InputStream類的實例對象,
目標接口是Reader類。
可以看到,InputStreamReader實現了Reader接口,并且持有了InputStream的引用,這里是通過StreamDecoder類間接持有的,因為從byte到char 要經過編碼。
總結
- 上一篇: 对象流及序列化
- 下一篇: IO流之过滤流介绍: