動態代理:
在目前的Java開發包中包含了對動態代理的支持,但是其實現只支持對接口的的實現。其實現主要通過是java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。Proxy類主要用來獲取動態代理對象,InvocationHandler接口用來約束調用者實現,
如下,IHelloWorld接口定義的業務方法,HelloWorld是IHelloWorld接口的實現,HelloWorldProxy是 InvocationHandler接口實現。
運行結果:
invoke before method!
say hello!
invoke after method!
- 首先獲取一個業務接口的實現對象;
- 獲取一個InvocationHandler實現,此處是HelloWorldProxy對象;
- 創建動態代理對象;(只支持對接口的的實現)
- 通過動態代理對象調用sayHello()方法,此時會在原始對象HelloWorld. sayHello()方法前後輸出兩句字符串。
Proxy模式:
代理是一種常用的設計模式,其目的就是爲其他對象提供一個代理以控制對某個對象的訪問。代理類負責爲委託類預處理消息,過濾消息並轉發消息,以及消息被委託類執行後的後續處理。
爲了保持行爲的一致性,代理類和委託類通常會實現相同的接口,所以在訪問者看來兩者沒有絲毫的區別。通過代理類這中間一層,能有效控制對委託類對象的直接訪問,也可以很好地隱藏和保護委託類對象,同時也爲實施不同控制策略預留了空間,從而在設計上獲得了更大的靈活性。
代理模式常用的兩個目的:
- 授權機制 不同級別的用戶對同一對象擁有不同的訪問權利,代理來控制這兩種用戶對資源的訪問權限.
- 某個客戶端不能直接操作到某個對象,但又必須和那個對象有所互動(如果那個對象是一個是很大的圖片,需要花費很長時間才能顯示出來,那麼當這個圖片包含在文檔中時,使用編輯器或瀏覽器打開這個文檔,打開文檔必須很迅速,不能等待大圖片處理完成,這時需要做個圖片Proxy來代替真正的圖片).
Decorator Pattern:
動態給一個對象添加一些額外的職責,就象在牆上刷油漆.使用Decorator模式相比用生成子類方式達到功能的擴充顯得更爲靈活.我們通常可以使用繼承來實現功能的拓展,如果這些需要拓展的功能的種類很繁多,那麼勢必生成很多子類,增加系統的複雜性。
使用Decorator的理由是:這些功能需要由用戶動態決定加入的方式和時機.Decorator提供了"即插即用"的方法,在運行期間決定何時增加何種功能.
總結:
Proxy模式和Decorator模式本質上沒什麼大的區別,只是他們的使用目的不一樣而已:proxy只是對現在功能作了代理,而decorator不是對現在功能代理,是添加新的功能。而Java自己的動態代理則是更靈活一點的代理模式的實現,代理類被動態生成。 他們都是java編程思想中對“繼承”“多態”“面向接口編程”原則的較好實踐而已。