第五章———代理模式

有兩天沒寫博客了,主要是這兩天比較疲憊店煞;于是乎買了本書《牧羊少年奇幻之旅》一本《超越華爾街》一本蟹演;主要為了尋找迷失的方向和自己當初的理想;不忘初心顷蟀,方得始終酒请;今后更當修身養(yǎng)性,尋求內(nèi)心的富足鸣个;好了今天我們來看看使用率相當高的代理模式羞反;
看看定義:
Provide a surrogate or placeholder for another object to control access to it.(為其他對象提供
一種代理以控制對這個對象的訪問布朦。)
由定義可見;對其他對象提供一種代理昼窗,那就是有代理者和被代理者(委托類)是趴;就像總統(tǒng)發(fā)言人一樣,他所說idea都代表總統(tǒng)的意思膏秫;他是總統(tǒng)的代理者右遭;理清了原理我們就清晰多了后續(xù),做什么我們就不會有那么多為什么缤削。

首先我們看下靜態(tài)代理:
假設(shè)有這么一個場景:我們都知道京東商城搞得是自營窘哈,所以國內(nèi)服務和質(zhì)量和速度做的很好;如果所有貨源都從北京總部發(fā)貨那肯定是做不到次日達或者當日達的亭敢;那么就要在各地設(shè)立分部倉儲滚婉;這個是不是可以理解為代理模式;我尋找一個代理倉庫負責這一片地方的貨物供給:好了我們寫了Demo;

定義一個統(tǒng)一倉庫的接口

    package com.ldl.proxytest;
   public interface Warehouse {
public void receiveOrder();

public void findProduct();

public void packUpProduct();

public void sendOutProduct();
      }

定義一個倉庫的實現(xiàn):

          package com.ldl.proxytest;
  public class WarehouseImpl implements Warehouse {
private String address;

public WarehouseImpl(String address) {
    super();
    this.address = address;
}

@Override
public void receiveOrder() {
    System.out.println(address + "收到訂單了");

}

@Override
public void findProduct() {
    System.out.println(address + "在尋找訂單");

}

@Override
public void packUpProduct() {
    // TODO Auto-generated method stub
    System.out.println(address + "在打包訂單了");

}

@Override
public void sendOutProduct() {
    // TODO Auto-generated method stub
    System.out.println(address + "發(fā)出訂單包裹了");

}
  }

我們在搞一個代理類:

package com.ldl.proxytest;
 public class WareHouseProxy implements Warehouse {
private Warehouse warehouse;

public WareHouseProxy(Warehouse warehouse) {
    super();
    this.warehouse = warehouse;
}

@Override
public void receiveOrder() {
    // TODO Auto-generated method stub
    this.warehouse.receiveOrder();

}

@Override
public void findProduct() {
    // TODO Auto-generated method stub
    this.warehouse.findProduct();
}

@Override
public void packUpProduct() {
    // TODO Auto-generated method stub
    this.warehouse.packUpProduct();
}

@Override
public void sendOutProduct() {
    // TODO Auto-generated method stub
    this.warehouse.sendOutProduct();
}

      }

哈哈完事了我們搞個客戶端測試一下唄:

        package com.ldl.proxytest;

       public class ProxyTest {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Warehouse wareHouse = new WarehouseImpl("深圳");
    Warehouse wareHouseProxy = new WareHouseProxy(wareHouse);
    wareHouseProxy.receiveOrder();
    wareHouseProxy.findProduct();
    wareHouseProxy.packUpProduct();
    wareHouseProxy.sendOutProduct();
}

}
圖片.png

歐了看到了吧效果還可以帅刀;我們用WareHouseProxy類代理WarehouseImpl让腹;WarehouseImpl是個委托者;我委托你作為我的代理扣溺;是不是還挺簡單骇窍?這就是靜態(tài)代理模式;那么如果說京東像阿里一樣一分為4獨立運營該怎么辦锥余;難道我們要為4家分別實現(xiàn)一個接口分別搞一個代理嗎腹纳?那么代理會不會顯得冗余,代理除了調(diào)用方法不同其他是一樣的驱犹;作為開發(fā)者看到重復代碼就要想辦法抽瘸盎小;好了不賣關(guān)子了我們用動態(tài)代理解決這個問題:

動態(tài)代理即我們可以動態(tài)創(chuàng)建不同的代理類:

下面我們先改造一下Demo在解釋:

  package com.ldl.proxytest;   
   import java.lang.reflect.InvocationHandler; 
     import java.lang.reflect.Method;
     public class WareHouseIH implements InvocationHandler {
// 被代理者
private Class cls;
// 代理誰(被代理的勢力實例)
private Object obj;
public WareHouseIH(Object obj) {
    super();
    this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    Object result = method.invoke(obj, args);
    return result;
}}

測試一下:

    package com.ldl.proxytest;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    public class ProxyTest {
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Warehouse wareHouse = new WarehouseImpl("深圳");
    InvocationHandler proxyHandler = new WareHouseIH(wareHouse);
    // 我們動態(tài)創(chuàng)建一個代理對象
    Warehouse proxy = (Warehouse) Proxy.newProxyInstance(wareHouse.getClass().getClassLoader(),
            wareHouse.getClass().getInterfaces(), proxyHandler);
    proxy.receiveOrder();
    proxy.findProduct();
    proxy.packUpProduct();
    proxy.sendOutProduct();
    // Warehouse wareHouseProxy = new WareHouseProxy(wareHouse);
    // wareHouseProxy.receiveOrder();
    // wareHouseProxy.findProduct();
    // wareHouseProxy.packUpProduct();
    // wareHouseProxy.sendOutProduct();
}  }

InvocationHandler是JDK提供的動態(tài)代理接口雄驹,對被代理類的方法進行代理佃牛;其中invoke方法是接口InvocationHandler定義必須實現(xiàn)的,它完成對真實方法的調(diào)用医舆。我
們來詳細講解一下InvocationHandler接口俘侠,動態(tài)代理是根據(jù)被代理的接口生成所有的方法,
也就是說給定一個接口蔬将,動態(tài)代理會宣稱“我已經(jīng)實現(xiàn)該接口下的所有方法了”爷速,
所有被代理的方法都由InvocationHandler接管實際的處理任務
看一下通用類圖:
 


圖片.png

動態(tài)代理實現(xiàn)代理的職責,業(yè)務邏輯Subject實現(xiàn)相關(guān)的邏輯功能娃胆,兩者之間沒有必然的相互耦合的關(guān)系

注意 要實現(xiàn)動態(tài)代理的首要條件是:被代理類必須實現(xiàn)一個接口,回想一下前面的分
析吧等曼。當然了里烦,現(xiàn)在也有很多技術(shù)如CGLIB可以實現(xiàn)不需要接口也可以實現(xiàn)動態(tài)代理的方
式凿蒜。這個我們知道就好,今天的任務是把代理搞明白胁黑;其實你清楚了原理废封;只要記住Proxy類即可;用時拿來即用丧蘸;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漂洋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子力喷,更是在濱河造成了極大的恐慌刽漂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弟孟,死亡現(xiàn)場離奇詭異贝咙,居然都是意外死亡,警方通過查閱死者的電腦和手機拂募,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門庭猩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陈症,你說我怎么就攤上這事蔼水。” “怎么了录肯?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵趴腋,是天一觀的道長。 經(jīng)常有香客問我嘁信,道長于样,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任潘靖,我火速辦了婚禮穿剖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卦溢。我一直安慰自己糊余,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布单寂。 她就那樣靜靜地躺著贬芥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宣决。 梳的紋絲不亂的頭發(fā)上蘸劈,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音尊沸,去河邊找鬼威沫。 笑死贤惯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的棒掠。 我是一名探鬼主播孵构,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烟很!你這毒婦竟也來了颈墅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雾袱,失蹤者是張志新(化名)和其女友劉穎恤筛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谜酒,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡叹俏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了僻族。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粘驰。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖述么,靈堂內(nèi)的尸體忽然破棺而出蝌数,到底是詐尸還是另有隱情,我是刑警寧澤度秘,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布顶伞,位于F島的核電站,受9級特大地震影響剑梳,放射性物質(zhì)發(fā)生泄漏唆貌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一垢乙、第九天 我趴在偏房一處隱蔽的房頂上張望锨咙。 院中可真熱鬧,春花似錦追逮、人聲如沸酪刀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骂倘。三九已至,卻和暖如春巴席,著一層夾襖步出監(jiān)牢的瞬間历涝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荧库,地道東北人诱担。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像电爹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子料睛,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 整體Retrofit內(nèi)容如下: 1丐箩、Retrofit解析1之前哨站——理解RESTful 2、Retrofit解析...
    隔壁老李頭閱讀 3,236評論 2 10
  • Java代理和動態(tài)代理機制分析和應用 概述 代理是一種常用的設(shè)計模式恤煞,其目的就是為其他對象提供一個代理以控制對某個...
    丸_子閱讀 3,024評論 6 57
  • 原文: Dyanmic Proxy Classes 介紹 一個動態(tài)代理類是實現(xiàn)了多個接口存在于運行時的類屎勘,這樣,一...
    半黑月缺閱讀 943評論 0 0
  • 我家的布局很奇怪居扒,書房和客廳之間有一道暗門概漱,狀似墻壁的一部分,所有第一次來家里做客的人都不知道這堵墻的后面隱有...
    清鵲閱讀 296評論 0 0
  • snow是一款wordpress博客主題喜喂,布局使用了瀑布流的方式瓤摧,文章三欄擺放。整個風格干凈利落玉吁,并且支持自適性顯...
    maolai博客閱讀 201評論 0 0