代理模式的典型例子,java代理模式的典型例子?

生活中,我們買(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)分享!


版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 sumchina520@foxmail.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。

您可能還會(huì)喜歡:

發(fā)表評(píng)論

◎歡迎參與討論,請(qǐng)?jiān)谶@里發(fā)表您的看法、交流您的觀點(diǎn)。