設(shè)計模式之代理模式

本章是對設(shè)計模式之禪一書中代理模式一章的總結(jié)與整理。

1.定義

為其它對象提供一種代理以控制對這個對象的訪問余佛。不好理解席函,設(shè)計模式的每種類型的定義第一遍都不太好讀懂的,這句話翻譯成大白話就是:你要想訪問我捌刮,對不起,找我代理吧舒岸。用另外的話說就是:你要訪問一個對象绅作,對不起,通過它的代理去訪問它吧蛾派,人家不想和你直接打交道俄认。最簡單的實例就是:你要去拜訪一個明星,是不是得先去找人家的經(jīng)紀(jì)人呢洪乍。代理就是這么個意思眯杏,這是根本,這個是宗旨壳澳。通用類圖如下:


代理模式類圖.png

2.擴(kuò)展與類型

第一類:普通代理

書中將普通代理分為了兩個大類岂贩,一個是透明代理,一個是普通代理巷波。

  1. 透明代理:就是用戶不用設(shè)置代理萎津,可以直接訪問真實的(比如代理服務(wù)器)

  2. 普通代理:要求是客戶只能訪問代理角色,而不能訪問真實的角色抹镊,這個是最好理解的锉屈。一個真實的示例就是:懶人買余額寶,由余額寶去買基金垮耳,余額寶就是代理角色颈渊,而你實際買的應(yīng)該是一些基金,只不過是通過余額寶購買的。

第二類:強(qiáng)制代理

這個比較變態(tài)儡炼,你根本不知道代理是誰妓湘,只知道真實角色是誰查蓉,你必須通過真實的對象獲取它的代理類乌询,然后通過代理類去訪問真實角色,如果不是真實角色給你的代理你也無法訪問豌研,挺變態(tài)的妹田。

示例是這樣的:你的一個朋友現(xiàn)在是一名很牛X的歌手,你要去訪問他鹃共,然后給他打電話問他什么時候有空鬼佣,然后他告訴你“這樣吧,你找我代理吧霜浴,讓他告訴你”晶衷,你說變態(tài)不變態(tài)。

第三類:虛擬代理

它的意思就是說:在需要的時候才初始化主題對象阴孟。我不太明白它的具體用途是什么晌纫?

第四類:動態(tài)代理

動態(tài)代理是在實現(xiàn)階段(就是編碼階段)不用關(guān)心代理是誰,而在運(yùn)行階段才指定代理哪一個對象永丝,反過來說锹漱,自己寫代理類的方式就是靜態(tài)代理。

我們來舉一個示例慕嚷,在帝都很多人都有過找房子的經(jīng)歷哥牍,以此為例。首先得有人喝检,定義一個接口租房子,它有兩個方法:找房子嗅辣,簽合同。


public interface IRent {

    public void searchHouse();
    public void contractHouse();
}

實現(xiàn)這個方法挠说,其代碼如下:

public class Renter implements IRent {

    String name="";

    public Renter(String _name){
        this.name=_name;
    }

    @Override
    public void searchHouse() {
        System.out.println(this.name+"正在找房子");

    }

    @Override
    public void contractHouse() {
        System.out.println(this.name+"正在簽合同");
    }
}

接下來實現(xiàn)代理類澡谭,其代碼如下:


public class RentProxy implements InvocationHandler {

    //被代理的對象
    Object target=null;

    public RentProxy(Object _object){
        this.target=_object;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //執(zhí)行被代理的方法
        //在執(zhí)行這個被代理的方法前后可以執(zhí)行你想執(zhí)行的操作,比如打印日志纺涤,判斷Session等
        return method.invoke(this.target,args);
    }
}

動態(tài)代理請務(wù)必實現(xiàn)InvocationHandler接口译暂,這個接口只有一個方法,在這個方法中調(diào)用被代理類的實際方法撩炊。這一點(diǎn)很不好理解外永,可以在此先記住這個,以后慢慢理解拧咳。

再看場景類的具體實現(xiàn):


public class Client {
    public static void main(String[] strings){
        //定義房客
        IRent iRent=new Renter("張三");
        //定義handler
        InvocationHandler invocationHandler=new RentProxy(iRent);
        //動態(tài)產(chǎn)生一個代理
        IRent proxy= (IRent)Proxy.newProxyInstance(iRent.getClass().getClassLoader(),new Class[]{IRent.class},invocationHandler);
        proxy.searchHouse();
        proxy.contractHouse();
    }
}

場景類分四步走:

  1. 定義房客

  2. 定義Handler

  3. 使用jdk 提供的Proxy類動態(tài)產(chǎn)生一個代理類

  4. 通過產(chǎn)生的動態(tài)代理類伯顶,去執(zhí)行相應(yīng)的方法

對比以上的場景類,基本就是按照這個思路來的。

以上這些就是代理模式的相關(guān)內(nèi)容祭衩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灶体,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掐暮,更是在濱河造成了極大的恐慌蝎抽,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件路克,死亡現(xiàn)場離奇詭異樟结,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)精算,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門瓢宦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灰羽,你說我怎么就攤上這事驮履。” “怎么了廉嚼?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵玫镐,是天一觀的道長。 經(jīng)常有香客問我前鹅,道長摘悴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任舰绘,我火速辦了婚禮蹂喻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捂寿。我一直安慰自己口四,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布秦陋。 她就那樣靜靜地躺著蔓彩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驳概。 梳的紋絲不亂的頭發(fā)上赤嚼,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音顺又,去河邊找鬼更卒。 笑死,一個胖子當(dāng)著我的面吹牛稚照,可吹牛的內(nèi)容都是我干的蹂空。 我是一名探鬼主播俯萌,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼上枕!你這毒婦竟也來了咐熙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辨萍,失蹤者是張志新(化名)和其女友劉穎棋恼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體分瘦,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蘸泻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年琉苇,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘲玫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡并扇,死狀恐怖去团,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情穷蛹,我是刑警寧澤土陪,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站肴熏,受9級特大地震影響鬼雀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛙吏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一源哩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸦做,春花似錦励烦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至治筒,卻和暖如春屉栓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耸袜。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工友多, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人句灌。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓夷陋,卻偏偏與公主長得像欠拾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子骗绕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 在某些情況下藐窄,一個客戶不想或者不能直接引用一個對象,此時可以通過一個稱之為“代理”的第三者來實現(xiàn) 間接引用酬土。代理對...
    李序鍇閱讀 387評論 0 2
  • 原文連接 簡介 Java編程的目標(biāo)是實現(xiàn)現(xiàn)實不能完成的荆忍,優(yōu)化現(xiàn)實能夠完成的,是一種虛擬技術(shù)撤缴。生活中的方方面面都可以...
    zjk_00閱讀 347評論 0 0
  • 代理模式基本概念 定義: 代理模式(Proxy Pattern)為其他對象提供一種代理以控制對這個對象的訪問刹枉。代理...
    Airing閱讀 1,038評論 0 9
  • Proxy Pattern 代理模式(Proxy Pattern)被稱為委托模式,屬于結(jié)構(gòu)性設(shè)計模式的一種 定義為...
    Allen_tong閱讀 938評論 0 1
  • 許多跑步大神都分享過屈呕,小步快跑才是長時間長距離跑步的秘訣微宝。小步快跑,每一次跨步的距離不需要很長虎眨,但需要提高跑步的步...
    唯川閱讀 12,765評論 6 19