天天看點

裝飾者模式,代理模式與擴充卡模式的比較

[size=medium][url]http://baike.baidu.com/view/2787758.htm[/url]

裝飾者與适配者模式的差別

1.關于新職責:擴充卡也可以在轉換時增加新的職責,但主要目的不在此。裝飾者模式主要是給被裝飾者增加新職責的。

2.關于原接口:擴充卡模式是用新接口來調用原接口,原接口對新系統是不可見或者說不可用的。裝飾者模式原封不動的使用原接口,系統對裝飾的對象也通過原接口來完成使用。(增加新接口的裝飾者模式可以認為是其變種--“半透明”裝飾者)

3.關于其包裹的對象:擴充卡是知道被适配者的詳細情況的(就是那個類或那個接口)。裝飾者隻知道其接口是什麼,至于其具體類型(是基類還是其他派生類)隻有在運作期間才知道

[url]http://www.cnblogs.com/jaredlam/archive/2011/11/08/2241089.html[/url]

對裝飾器模式來說,裝飾者(decorator)和被裝飾者(decoratee)都實作同一個接口。

對代理模式來說,代理類(proxy class)和真實處理的類(real class)都實作同一個接口。此外,不論我們使用哪一個模式,都可以很容易地在真實對象的方法前面或者後面加上自定義的方法。

然而,實際上,在裝飾器模式和代理模式之間還是有很多差别的。

裝飾器模式關注于在一個對象上動态的添加方法,然而代理模式關注于控制對對象的通路。換句話 說,用代理模式,代理類(proxy class)可以對它的客戶隐藏一個對象的具體資訊。

是以,當使用代理模式的時候,我們常常在一個代理類中建立一個對象的執行個體。并且,當我們使用裝飾器模式的時候,我們通常的做法是将原始對象作為一個參數傳給裝飾者的構造器。

[url]http://jqsl2012.iteye.com/blog/1391448[/url]

代理模式是一種很常用的設計模式,其目的是對其他對象提供一種代理以控制對這個對象的通路。

代理模式又分為靜态代理和動态代理,靜态代理是在程式運作之前就已經存在了代理類,動态代理是程式運作中在記憶體中生成代理類。

代理模式存在的意義:代理模式是為了解決濫用繼承的問題而生的,當想對某個類的功能進行擴充的時候可以使用繼承或聚合,很明顯用繼承的話會造成類泛濫,還有一點就是繼承是類具有很強的層級關系的情況下用才好,而緊緊對某個類進行功能的擴充就拿起繼承的大刀明顯的不合适,那麼用聚合呢?

聚合是一種松耦合的,用聚合建立的代理類就是靜态代理,還有更好的代理是動态代理。

動态代理自己實作其實也很簡單,不過JDK提供了友善的解決方案。

java.lang.reflect.InvocationHandler

java.lang.reflect.Proxy

這兩個東東就是為動态代理而生的

其實裝飾模式和代理模式極為相似,更近一步,[color=darkred]裝飾模式和靜态代理極為相似[/color]

相同點:都是為被代理(被裝飾)的類擴充新的功能。

不同點:代理模式具有控制被代理類的通路等性質,而裝飾模式緊緊是單純的擴充被裝飾的類。[color=darkred]是以差別僅僅在是否對被代理/被裝飾的類進行了控制而已。[/color] [/size]

繼續閱讀