裝飾者模式

解決的問題

在不改變原有對象結構情況下,爲類動態增加功能,避免了通過繼承方式進行功能擴充導致的類體系臃腫 ,且可以採用任意順序組織這些功能。

裝飾者模式類圖


Component是要被裝飾的接口,ConcreteComponent是具體被裝飾的類;Decorator是裝飾器共同接口,各個具體的裝飾器實現相同的裝飾器接口;在裝飾器中持有被裝飾的Component,因爲裝飾器也繼承自Component,所以可以採用如下方式組合使用:
Component target = new ConcreteComponent();
ConcreteDecoratorA decA = new ConcreteDecoratorA(target);
ConcreteDecoratorB decB = new ConcreteDecoratorB(decA); 

IO流使用裝飾器模式


IO流的常用手法:
InputStream in = new FileInputStream("file.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
reader.readLine();

與代理模式的比較

裝飾器模式乍看與代理模式很像,回顧代理模式的類圖:
與裝飾器模式一樣,代理類也繼承自目標類,同時持有目標類的引用。但是兩者的使用場景不一樣,代理模式主要是爲了修改目標類的行爲和方法,客戶端使用的接口還是被代理類型,只不過引用的實際類型是代理類。而裝飾器模式中,客戶實際使用的就是裝飾器類型來包裝目標類型,並調用裝飾器提供的特殊方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章