讀書筆記:淺談代理模式

什么是代理模式呢苗桂,就是先創(chuàng)建一個(gè)接口,這個(gè)接口中定義了一些未實(shí)現(xiàn)的方法趴泌,再定義兩個(gè)類A舟舒、B來(lái)分別實(shí)現(xiàn)這些接口,其中類A用來(lái)實(shí)現(xiàn)具體的方法嗜憔,這被稱為目標(biāo)實(shí)現(xiàn)類秃励,而另一個(gè)類B是通過(guò)設(shè)置一些條件來(lái)判斷要不要來(lái)進(jìn)行調(diào)用A類的接口實(shí)現(xiàn),那么B被稱為代理類吉捶。就是說(shuō)我們可以通過(guò)代理類來(lái)間接訪問(wèn)目標(biāo)類夺鲜,下面我來(lái)舉一個(gè)例子:
人的基本需求是什么?買東西澳盘颉币励!所以我們來(lái)定義一個(gè)人的接口如下:

interface People{
    public void buy();
}

好了,但是人的欲望是無(wú)窮的珊拼,但是如果你要買東西食呻,比如iphone,那么你的身上必須得有錢才行吧澎现,所以我們定義了一個(gè)有‘錢’這屬性的客戶

class Customer implements People{
    private int money;

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    @Override
    public void buy(){
        System.out.println("買了一臺(tái)iphone");
    }
}

我們看上面的代碼仅胞,我們就會(huì)發(fā)現(xiàn)一個(gè)關(guān)系沒(méi)有被關(guān)聯(lián)起來(lái),那就是金錢和買iphone之間的關(guān)系剑辫,并不是你有多少錢都可以買一個(gè)iphone的干旧,你得是土豪才可以,于是我們可以在buy()方法中增加如下的判斷語(yǔ)句

    @Override
    public void buy(){
        if(money > 4000)
            System.out.println("買了一臺(tái)iphone");
    }

可是Apple公司會(huì)發(fā)布新的iphone揭斧,價(jià)格也是水漲船高莱革,那么我們就得不停地修改上面判斷條件峻堰,這樣的不停地改動(dòng)很麻煩,也不符合面向?qū)ο笾械拈_(kāi)閉原則盅视,即

需求的變更捐名,新的功能的添加應(yīng)該用對(duì)原有進(jìn)行拓展的方式進(jìn)行,而不是通過(guò)修改原有代碼來(lái)實(shí)現(xiàn)

所以我們維持Customer類的簡(jiǎn)單性闹击,而通過(guò)一個(gè)新增一個(gè)類來(lái)對(duì)上面的邏輯進(jìn)行處理镶蹋,這個(gè)類的功能是什么呢?首先檢查你的錢包赏半,假如你的錢包里面的鈔票不給力贺归,那對(duì)不起,你沒(méi)有資格購(gòu)買iphone断箫,這個(gè)充當(dāng)檢查錢包的類被稱為代理類拂酣,如下:

public class StaticProxy implements People{
    People people;

    public StaticProxy(People people){
        this.people = people;
    }

    public void buy(){
        if (((Customer)people).getMoney() > 4000)
            people.buy();
        else
            System.out.println("你無(wú)法購(gòu)買iphone");
    }

    public static void test(){
        Customer customer1 = new Customer();
        customer1.setMoney(5000);
        StaticProxy proxy = new StaticProxy(customer1);
        proxy.buy();
    }
}

那么新的iphone發(fā)布的時(shí)候,我們只要修改代理類中的判斷邏輯就可以了仲义,但是這種方式有沒(méi)有缺點(diǎn)呢婶熬,肯定的嘛,我們仔細(xì)看一下上面的代碼埃撵,代理類和目標(biāo)類都實(shí)現(xiàn)了People這個(gè)接口赵颅,假如People接口新增了方法,那么這兩個(gè)類都需要進(jìn)行添加方法的實(shí)現(xiàn)才可以暂刘,那么有沒(méi)有更省事的方法呢饺谬?答案是有的,那就是動(dòng)態(tài)代理谣拣。
動(dòng)態(tài)代理省去了代理類添加接口實(shí)現(xiàn)方法的過(guò)程募寨,那么它是怎么實(shí)現(xiàn)的呢,如下:

public class DynamicProxy {
    private Object target;

    public DynamicProxy(Object target){
        this.target = target;
    }

    public Object getProxyInstance(){
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object returnedValue = method.invoke(target,args);
                        return returnedValue;
                    }
                });
    }
}

上面的核心代碼是這句:

Object returnedValue = method.invoke(target,args);

其中的invoke方法芝发,它的作用是這樣的:

1绪商、我們通過(guò)反射根據(jù)類的方法名和方法參數(shù)來(lái)獲取一個(gè)對(duì)象所屬類的方法對(duì)象
2苛谷、根據(jù)方法對(duì)象的invoke方法輸入對(duì)象實(shí)例和參數(shù)值來(lái)獲取這個(gè)方法的輸出

具體的原理可看源代碼辅鲸,我這里不再贅述。好了腹殿,我們看一下測(cè)試代碼

       People people = new Customer();
       ((Customer)people).setMoney(10000);
       People proxy = (People) new DynamicProxy(people).getProxyInstance();
       proxy.buy();

可以看到独悴,我們并沒(méi)有在動(dòng)態(tài)代理中實(shí)現(xiàn)這個(gè)接口的方法,所以利用動(dòng)態(tài)代理锣尉,我們?cè)黾咏涌谥械姆椒〞r(shí)只需要增加目標(biāo)類的實(shí)現(xiàn)即可刻炒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市自沧,隨后出現(xiàn)的幾起案子坟奥,更是在濱河造成了極大的恐慌树瞭,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爱谁,死亡現(xiàn)場(chǎng)離奇詭異晒喷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)访敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門凉敲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人寺旺,你說(shuō)我怎么就攤上這事爷抓。” “怎么了阻塑?”我有些...
    開(kāi)封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蓝撇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我陈莽,道長(zhǎng)唉地,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任传透,我火速辦了婚禮耘沼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朱盐。我一直安慰自己群嗤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布兵琳。 她就那樣靜靜地躺著狂秘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪躯肌。 梳的紋絲不亂的頭發(fā)上者春,一...
    開(kāi)封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音清女,去河邊找鬼钱烟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嫡丙,可吹牛的內(nèi)容都是我干的拴袭。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼曙博,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拥刻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起父泳,我...
    開(kāi)封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤般哼,失蹤者是張志新(化名)和其女友劉穎吴汪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蒸眠,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浇坐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黔宛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片近刘。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖臀晃,靈堂內(nèi)的尸體忽然破棺而出觉渴,到底是詐尸還是另有隱情,我是刑警寧澤徽惋,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布案淋,位于F島的核電站,受9級(jí)特大地震影響险绘,放射性物質(zhì)發(fā)生泄漏踢京。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一宦棺、第九天 我趴在偏房一處隱蔽的房頂上張望瓣距。 院中可真熱鬧,春花似錦代咸、人聲如沸蹈丸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逻杖。三九已至,卻和暖如春思瘟,著一層夾襖步出監(jiān)牢的瞬間荸百,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工滨攻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留够话,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓铡买,卻偏偏與公主長(zhǎng)得像更鲁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奇钞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,863評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)漂坏,斷路器景埃,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • 只是想提一點(diǎn)問(wèn)題媒至,如果有什么言語(yǔ)不當(dāng)?shù)牡胤剑€請(qǐng)各位勿噴谷徙! 我是一位大學(xué)生拒啰,當(dāng)時(shí)高考填志愿時(shí)拼了命考到了南方。因?yàn)?..
    凌渡澹閱讀 384評(píng)論 0 0
  • 傍 晚 太陽(yáng)西墜了完慧,晚霞絢爛了谋旦,鳥(niǎo)兒嘰喳歸巢了。 影子窈窕了屈尼,炊煙起舞了册着,油花朵朵綻開(kāi)了。 餐廳燈亮了脾歧,碗筷...
    相處以墨閱讀 216評(píng)論 1 3
  • 時(shí)光荏苒甲捏, 記憶最深的總是父親的不善言辭和他布滿老繭的雙手。每當(dāng)想起它們鞭执,眼淚就會(huì)奪眶而出…… ...
    怡萱依然閱讀 340評(píng)論 0 1