国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
代理模式之強(qiáng)制代理模式以及動(dòng)態(tài)代理原理

 

1:強(qiáng)制代理模式

         普通代理模式和強(qiáng)制代理模式是代理模式的其中倆個(gè)部分。對(duì)于這倆個(gè)代理模式,我們采用一個(gè)類(lèi)似事情解釋下:

在網(wǎng)絡(luò)上的代理服務(wù)器分透明代理和普通代理;對(duì)于透明代理來(lái)說(shuō),字如其意,就是這個(gè)代理服務(wù)器對(duì)用戶來(lái)說(shuō)是透明的,用戶根本不知道這個(gè)服務(wù)器的存在。而普通代理則是用戶需要自己手動(dòng)去設(shè)置代理服務(wù)器的ip,很顯然,對(duì)于這點(diǎn)上,用戶必須知道代理服務(wù)器的存在?,F(xiàn)在對(duì)號(hào)入座:代理模式中的強(qiáng)制代理類(lèi)似網(wǎng)絡(luò)上的代理服務(wù)器的透明代理代理模式中的普通代理模式就類(lèi)似網(wǎng)絡(luò)上的代理服務(wù)器的普通代理。

普通代理模式比較常見(jiàn),在這里就不作多說(shuō)了,那么在這里就重點(diǎn)來(lái)看看強(qiáng)制代理模式。

 

        強(qiáng)制代理模式在設(shè)計(jì)模式中比較怪怪的,很另類(lèi)。一般的思維都是通過(guò)代理模式找到真實(shí)的角色,但是強(qiáng)制代理模式反其道而行之,必須強(qiáng)制通過(guò)真實(shí)角色去查找到到模式,否則不能訪問(wèn)。換句話說(shuō)就是有真實(shí)角色去管理代理角色??偠灾壕褪峭ㄟ^(guò)new或者其他方式創(chuàng)建一個(gè)真實(shí)角色的對(duì)象,最后卻是會(huì)有真實(shí)角色返回他自己的代理角色。類(lèi)似日常生活中:哥們?cè)巯胪ㄟ^(guò)給點(diǎn)錢(qián)給某某局長(zhǎng),讓他出面給咱們半個(gè)事情,結(jié)果他給我們一張他秘書(shū)的名片(理由很簡(jiǎn)單,這種事情當(dāng)老大的不會(huì)出面),讓他們本想通過(guò)局長(zhǎng)要做的事情,直接通過(guò)秘書(shū)去做。其實(shí):秘書(shū)能做這些,也就是此局長(zhǎng)的權(quán)勢(shì);說(shuō)白了秘書(shū)就是該局長(zhǎng)的替身,代理。上圖:

 

在接口上設(shè)置一個(gè)getProxy()方法,真實(shí)角色就能可以指定一個(gè)自己的代理。除了代理,誰(shuí)也不能訪問(wèn)。很顯然,當(dāng)官的人都是會(huì)讓指定的親信做事,其他人信不過(guò),當(dāng)然不能勝任此事。上代碼:局長(zhǎng)抑或秘書(shū)至少都是官員

 

 

 

 

真實(shí)角色和代理角色都應(yīng)該實(shí)現(xiàn)上面的基類(lèi)。

 

真實(shí)角色,增加一個(gè)私有方法,檢查是否為自己的代理,如果是自己的代理,才能執(zhí)行自己的方法。接下來(lái)看看代替實(shí)現(xiàn):

 

 

 

 

 下面將演示3中場(chǎng)景:

 

運(yùn)行結(jié)果:

 

場(chǎng)景1:

please user pointed proxy receiveMoney
please user pointed proxy sendMoney

 

場(chǎng)景2:

please user pointed proxy receiveMoney
please user pointed proxy sendMoney

 

場(chǎng)景3:

張局長(zhǎng) are starting to receiveMoney
張局長(zhǎng) are starting to sendMoney

 

        所以從上面的實(shí)例中可以得出:強(qiáng)制代理的概念就是必須從真實(shí)角色中查找返回其代理角色,不允許直接通過(guò)調(diào)用真實(shí)角色的方法,因?yàn)樵诿看握{(diào)用真實(shí)角色從基類(lèi)繼承的方法時(shí)候,該方法都會(huì)先去判斷是否為代理調(diào)用。高層模塊只需訪問(wèn)真實(shí)角色的getProxy(),就可以完成訪問(wèn)真實(shí)角色的所有方法,它根本就不需要產(chǎn)生一個(gè)代理處理,代理的管理已經(jīng)由真實(shí)角色自己完成。強(qiáng)制代理模式使得高層模塊與真實(shí)角色的業(yè)務(wù)場(chǎng)景耦合度極地;真實(shí)角色的修改,在高層模塊中完全不用修改。倆者只通過(guò)真實(shí)角色提供的一個(gè)getProxy()接口來(lái)交互。在整個(gè)實(shí)現(xiàn)過(guò)程,采用回調(diào)思想,在真實(shí)角色中調(diào)用代理對(duì)象的方法,代理對(duì)象通過(guò)回調(diào)來(lái)調(diào)用真實(shí)角色的方法。

 

2:動(dòng)態(tài)代理模式

       先解釋下何為動(dòng)態(tài)代理模式,所謂動(dòng)態(tài)代理模式就是在實(shí)現(xiàn)階段毋須關(guān)心代理誰(shuí),只有在運(yùn)行階段才指定代理哪一個(gè)對(duì)象。通俗點(diǎn)講就是:自己動(dòng)手寫(xiě)代理類(lèi)的方式就是靜態(tài)代理模式。采用動(dòng)態(tài)代理模式比較為大家所熟知的比如AOP(切面編程),其核心機(jī)制就是采用動(dòng)態(tài)代理機(jī)制。我們繼續(xù)使用上面的官員行賄和受賄的例子來(lái)解析動(dòng)態(tài)代理模式原理:上圖

 

 

 

 

 

在類(lèi)圖中增加一個(gè)InvocationHandler接口;其中InvocationHandler是JDK提供的動(dòng)態(tài)代理接口,對(duì)被代理的類(lèi)(即是真實(shí)角色的對(duì)象,譬如上例中的局長(zhǎng)角色)的方法進(jìn)行代理。看代碼:

其中invoke方法是InvocationHandler派生類(lèi)必須實(shí)現(xiàn)的方法,它完成對(duì)真實(shí)角色(秘書(shū)調(diào)用局長(zhǎng)的方法)的方法的調(diào)用。動(dòng)態(tài)代理就是根據(jù)被代理的真實(shí)角色所屬的接口生成所有方法,換而言之:代理對(duì)象已經(jīng)實(shí)現(xiàn)接口下(IOfficer)的所有方法。類(lèi)似靜態(tài)代理模式:public class OfficerProxy implements IOfficer 也要實(shí)現(xiàn)該接口下所有方法。

 

 

 

運(yùn)行結(jié)果:

張局長(zhǎng) are starting to receiveMoney
張局長(zhǎng) are starting to sendMoney

 

粗看很不解,IOfficer proxy是生成的代理類(lèi),但是沒(méi)有看到代理類(lèi)實(shí)現(xiàn)接口的方法。(IOfficer) Proxy.newProxyInstance來(lái)生成代理對(duì)象,里面到底是如何處理的,我們進(jìn)去看看Proxy.newProxyInstance這個(gè)方法:

 

 

可見(jiàn)關(guān)鍵之處在于Class cl = getProxyClass(loader, interfaces);Proxy利用類(lèi)裝載器和代理類(lèi)的接口來(lái)生成一個(gè)實(shí)現(xiàn)了接口各個(gè)方法的代理類(lèi)的class對(duì)象。我們分析下代碼getProxyClass(loader, interfaces)代碼

 

 

所以:Proxy.newProxyInstance內(nèi)部機(jī)制為:

 

1:實(shí)現(xiàn)接口
2:裝載字節(jié)流文件到虛擬機(jī)
3:實(shí)例化,并返回對(duì)象

 

類(lèi)推:代理對(duì)象調(diào)用方法:Proxy.sendMoney(),他的實(shí)現(xiàn)應(yīng)該類(lèi)似如何:

通過(guò)InvocationHandler的invoke方法類(lèi)來(lái)調(diào)用真實(shí)角色對(duì)應(yīng)方法

 

 

 

 

 

 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
細(xì)細(xì)品讀 Retrofit 的設(shè)計(jì)之美一
C#設(shè)計(jì)模式之代理模式(一)
C#設(shè)計(jì)模式學(xué)習(xí)筆記:(12)代理模式
《Head First設(shè)計(jì)模式》閱讀筆記.全書(shū)總結(jié)
輕松學(xué),Java 中的代理模式及動(dòng)態(tài)代理【面試+工作】
Java代理模式實(shí)現(xiàn)與詳解(二)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服