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