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