生活中,我們買(mǎi)房子或者賣房子的時(shí)候,大多數(shù)的情況下我們是不能直接找到并面對(duì)客戶的,這個(gè)時(shí)候我們往往會(huì)借助中介或者代理的方式來(lái)完成我們的想法。與此類似的,在軟件設(shè)計(jì)中,使用代理模式的例子也很多,下面我們簡(jiǎn)要說(shuō)明。
定義與特點(diǎn)
由于某些原因需要給某對(duì)象提供一個(gè)代理以控制對(duì)該對(duì)象的訪問(wèn)。這時(shí),訪問(wèn)對(duì)象不適合或者不能直接引用目標(biāo)對(duì)象,代理對(duì)象作為訪問(wèn)對(duì)象和目標(biāo)對(duì)象之間的中介。簡(jiǎn)單來(lái)說(shuō)就是,為一個(gè)類(委托類)創(chuàng)建一個(gè)代理類,由代理類來(lái)代表它來(lái)對(duì)外提供功能。
代理模式的優(yōu)缺點(diǎn):
優(yōu)點(diǎn)有:
- 在客戶端與目標(biāo)對(duì)象之間起到一個(gè)中介作用和保護(hù)目標(biāo)對(duì)象的作用;
- 代理對(duì)象可以擴(kuò)展目標(biāo)對(duì)象的功能;
- 將客戶端與目標(biāo)對(duì)象分離,在一定程度上降低了系統(tǒng)的耦合度,增加了程序的可擴(kuò)展性
缺點(diǎn)是:
- 代理模式會(huì)造成系統(tǒng)設(shè)計(jì)中類的數(shù)量增加
- 在客戶端和目標(biāo)對(duì)象之間增加一個(gè)代理對(duì)象,會(huì)造成請(qǐng)求處理速度變慢;
- 無(wú)故增加了系統(tǒng)的復(fù)雜度;
代理模式的構(gòu)造方式:
首先要明確兩個(gè)角色,一個(gè)是委托類,一個(gè)是代理類。二者共同實(shí)現(xiàn)一個(gè)公共接口。
沿著這個(gè)思路我們?cè)O(shè)計(jì)這樣一個(gè)場(chǎng)景。比如富豪張三(Zhangsan)無(wú)故被人抹黑造謠,由于自己公務(wù)繁忙,無(wú)法到公共場(chǎng)合為自己發(fā)表清白聲明,于是找到了律師(Lawyer)代自己公開(kāi)進(jìn)行一份聲明。下面就是我們的代碼秀:
//公共接口
interface Announce {
//對(duì)外聲明
void declare();
}
//委托人
class Zhangsan implements Announce {
//對(duì)外聲明
public void declare() {
System.out.println("我是張三,我是清白的。巴拉巴拉巴拉巴拉巴拉啦啦啦啦啦");
}
}
//代理人
class Lawyer implements Announce {
//聲明為張三提供服務(wù)
private Announce zhangsan = new Zhangsan();
//對(duì)外聲明
public void declare() {
this.preDeclaration()
//張三的實(shí)際發(fā)聲
zhangsan.declare();
this.postDeclaration();
}
//禮貌起見(jiàn),聲明之前介紹自己身份
private void preDeclaration() {
System.out.println("大家好,我是張三先生的私人律師");
}
//禮貌起見(jiàn),聲明完成之后可以致謝
private void postDeclaration() {
System.out.println("感謝大家對(duì)張三先生的支持");
}
}
//寫(xiě)了半天,我們來(lái)測(cè)試下實(shí)際效果
public class ProxyAnnounce{
public static void main(String[] args){
private Announce lawyer = new Lawyer();
lawyer.declare();
}
}
輸出結(jié)果為:
大家好,我是張三先生的私人律師
我是張三,我是清白的。巴拉巴拉巴拉巴拉巴拉啦啦啦啦啦
感謝大家對(duì)張三先生的支持
上面是一個(gè)很簡(jiǎn)單的例子,可以看出,我們想對(duì)外開(kāi)放某些功能,就可以將這些功能在代理類中被引用,如此一來(lái),屏蔽了我們不想外露的功能,只將我們想開(kāi)放的功能開(kāi)放出來(lái)。亦即委托類中其實(shí)是可以有很多方法的,很多功能的,我們可以酌情對(duì)外開(kāi)放,代理類猶如一道大門(mén),將委托類與外部調(diào)用者隔絕開(kāi)來(lái),只將部分功能賦予這個(gè)大門(mén),來(lái)代替委托類行使這個(gè)功能,哪怕最終還是要牽扯到自身(因?yàn)樽罱K還是要調(diào)用委托類的對(duì)應(yīng)方法實(shí)現(xiàn))。
如若有想學(xué)習(xí)和交流Java的朋友,可添加微信號(hào):zhuawac,請(qǐng)備注來(lái)意,否則會(huì)被拒哦!
好了,這篇文章的內(nèi)容發(fā)貨聯(lián)盟就和大家分享到這里,如果大家網(wǎng)絡(luò)推廣引流創(chuàng)業(yè)感興趣,可以添加微信:80709525 備注:發(fā)貨聯(lián)盟引流學(xué)習(xí); 我拉你進(jìn)直播課程學(xué)習(xí)群,每周135晚上都是有實(shí)戰(zhàn)干貨的推廣引流技術(shù)課程免費(fèi)分享!