定義:為某個(gè)對象提供一個(gè)代理,以達(dá)到對這個(gè)對象的訪問控制,代理類和委托類有共同的父類或者父接口,這樣可以在使用委托類的地方都可以使用代理對象來替換(這符合程序設(shè)計(jì)中的“里氏替換原則”),代理類負(fù)責(zé)請求的預(yù)處理、過濾等初步處理之后,再將請求分派給委托類進(jìn)行處理,代理類當(dāng)然也可以在委托類執(zhí)行完畢之后做一些其它工作;
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)公司、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了昌江免費(fèi)建站歡迎大家使用!
代理模式根據(jù)代理類的生成時(shí)間不同可以靜態(tài)代理和動(dòng)態(tài)代理。
靜態(tài)代理:是由程序員創(chuàng)建或工具生成代理類的源碼,在編譯期就已經(jīng)確定了委托類和代理類,在程序運(yùn)行前就已經(jīng)存在代理類的字節(jié)碼文件,代理類和委托類的關(guān)系在運(yùn)行前就已經(jīng)確定了。
動(dòng)態(tài)代理:動(dòng)態(tài)代理類的源碼是在程序運(yùn)行期間由JVM根據(jù)反射等機(jī)制動(dòng)態(tài)生成的 ,所以不存在代理類的字節(jié)碼文件,代理類和委托類的關(guān)系在程序運(yùn)行時(shí)動(dòng)態(tài)確定。
說了這么多那么代理有什么優(yōu)點(diǎn)呢?
說起了一大堆,總的來說主要有兩大點(diǎn):1、可以對客戶端隱藏委托類的實(shí)現(xiàn);2、可以實(shí)現(xiàn)客戶端和委托類之間的解耦,在不修改委托類的情況下做一些其他的處理,當(dāng)然核心業(yè)務(wù)還得調(diào)用委托類的方法處理;
日常生活中代理的場景很常見,比如說我們有一套房子需要出售,但是我們沒有時(shí)間自己天天帶看房,那么我們就可以把這套房子掛委托給房產(chǎn)中介,中介就可以幫我們篩選潛在客戶,帶客戶看房,確定買家之后,中介就聯(lián)系我們和買家簽訂合同,買家付款、雙方完成過戶、房屋物業(yè)水電燃?xì)饨唤邮乱说龋谶@個(gè)過程中賣家就是委托類,而中介就是代理類;
其實(shí)在Java中也有很多場景需要使用代理,如RPC的遠(yuǎn)程調(diào)用,我們就是通過代理類去實(shí)現(xiàn)的,還有Spring中的AOP切面也是為切面生成了代理類;
下面我們先講講靜態(tài)代理的實(shí)現(xiàn):
1、定義接口和接口的實(shí)現(xiàn)(委托類);
2、定義代理類(定義接口的代理對象);
3、將接口的實(shí)例注入到代理對象中,然后通過代理對象去調(diào)用委托類的實(shí)現(xiàn);
靜態(tài)代理的示例代碼如下:
package cn.com.pep.model.proxy; /** * *@version: 1.0 * @Description: 聲明委托類的行為,賣房 *@author: wwh * @date: 2022年9月4日-下午4:17:12 */ public interface Sell { public void sellHouse(); }