首頁 >Java >java教程 >java中什麼是代理模式

java中什麼是代理模式

(*-*)浩
(*-*)浩原創
2019-05-28 13:10:234135瀏覽

代理(Proxy)是一種設計模式,提供了對目標物件另外的存取方式;即透過代理物件存取目標物件.這樣做的好處是:可以在目標物件實現的基礎上,增強額外的功能操作,即擴展目標物件的功能.

java中什麼是代理模式

這裡使用到程式設計中的一個想法:不要隨意去修改別人已經寫好的程式碼或方法,如果需改修改,可以透過代理的方式來擴展該方法

舉個例子來說明代理的作用:假設我們想邀請一位明星,那麼並不是直接連接明星,而是聯繫明星的經紀人,來達到同樣的目的.明星就是一個目標對象,他只要負責活動中的節目,而其他瑣碎的事情就交給他的代理人(經紀人)來解決.這就是代理思想在現實中的一個例子

代理模式的關鍵點是:代理物件與目標物件.代理物件是對目標物件的擴充,並且會呼叫目標物件

靜態代理





靜態代理在使用時,需要定義介面或父類別,被代理物件與代理物件一起實作相同的介面或是繼承相同父類別.
下面舉個案例來解釋:
模擬保存動作,定義一個保存動作的接口:IUserDao.java,然後目標對象實現這個接口的方法UserDao.java,此時如果使用靜態代理方式,就需要在代理對象(UserDaoProxy.java)中也實現IUserDao接口.呼叫的時候透過呼叫代理物件的方法來呼叫目標物件.
要注意的是,代理物件與目標物件要實作相同的介面,然後透過呼叫相同的方法來呼叫目標物件的方法

靜態代理總結:
#1.可以做到在不修改目標物件的功能前提下,對目標功能擴展.

2.缺點:

因為代理物件需要與目標物件實現一樣的介面,所以會有很多代理類別,類別太多.同時,一旦介面增加方法,目標物件與代理物件都要維護.

#如何解決靜態代理程式中的缺點呢?答案是可以使用動態代理方式

動態代理

#動態代理程式有以下特點:##1.代理物件,不需要實作介面2.代理物件的產生,是利用JDK的API,動態的在記憶體中建構代理物件(需要我們指定建立代理物件/目標物件實現的介面的型別)
3.動態代理也叫做:JDK代理程式,介面代理


總結:

###代理物件不需要實作介面,但是目標物件一定要實作介面,否則不能用動態代理##### ####Cglib代理#########上面的靜態代理和動態代理模式都是要求目標對像是實現一個接口的目標對象,但是有時候目標對像只是一個單獨的對象,並沒有實現任何的接口,這個時候就可以使用以目標對象子類的方式類實現代理,這種方法就叫做:Cglib代理######Cglib代理,也叫作子類代理,它是在內存中構建子類別物件從而實現對目標物件功能的擴展.######JDK的動態代理有一個限制,就是使用動態代理的物件必須實現一個或多個介面,如果想代理沒有實現介面的類別,就可以使用Cglib實現.Cglib是一個強大的高性能的代碼生成包,它可以在運行期擴展java類與實現java接口.它廣泛的被許多AOP的框架使用,例如Spring AOP和synaop,為他們提供方法的interception(攔截)Cglib包的底層是透過使用一個小而區塊的字節碼處理框架ASM來轉換字節碼並產生新的類別.不鼓勵直接使用ASM,因為它要求你必須對JVM內部結構包括class檔案的格式和指令集都很熟悉.#########Cglib子類代理實現方法:######1.需要引入cglib的jar檔,但是Spring的核心包中已經包含了Cglib功能,所以直接引入pring-core-3.2.5.jar即可.###2.引入功能包後,就可以在內存中動態構建子類###3.代理的類別不能為final ,否則報錯###4.目標物件的方法如果為final/static,那麼就不會被攔截,即不會執行目標物件額外的業務方法.###

以上是java中什麼是代理模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn