Dev@Free

          zJun's Tech Weblog

          [GoF23] java中的Proxy模式(續)

          上一篇隨筆 中,由于時間和篇幅的關系只是簡單介紹了Proxy模式的概念,并沒有寫到Java中對Proxy模式特有的支持,所以嚴格說起來是有點"名不符實",現在就接著介紹JDK中Proxy模式的實現:
          Java API中提供了對Proxy模式的支持,主要是通過反射(Reflect)包中的Proxy類和InvocationHandler接口實現,具體過程如下:
          ----------------------------------------------------------------
          (1) 實現InvocationHandler接口,在invoke()方法中實現代理類要完成的操作;
          (2) 通過Proxy.newProxyInstance(ClassLoader loader,Class[]
          interfaces,InvocationHandler h)
          方法生成一個代理類,從參數可以看出代理類將實現被代理對象的接口,而具體的實現過程是在上面實現的InvocationHandler.invoke()中定義的.
          ----------------------------------------------------------------
          我們還是用演藝圈的例子來說明:
          首先,類的關系圖需要修改一下:

          可以看出,這里并沒有經紀人(Broke)類,而是新增了一個經紀人操作類(BrokeHandler),這是因為通過Proxy.newProxyInstance()方法,Java API將自動為我們生成一個對于Artist接口的代理類(即:Broke),我們只需定義代理的操作即可.

          經紀人工作:

          /**
          ?*?經紀人工作
          ?*?
          ?*?
          @author ?zjun
          ?*?
          @version
          ?1.0?create?on?2006-4-11?18:06:36
          ?
          */

          public ? class ?BrokerHandler? implements ?InvocationHandler? {

          ????
          private ?String?SIGN? = ? " ?[經紀人工作]? "
          ;

          ????
          // ?旗下明星

          ???? private ?Star?star;

          ????
          public ?BrokerHandler(Star?star)?
          {
          ????????
          this .star? =
          ?star;
          ????}


          ????
          /**
          ?????*?簽訂和約
          ?????
          */

          ????
          private ? void ?subcontract()? {
          ????????System.out.println(SIGN?
          + ? " ?簽訂和約? "
          );
          ????}


          ????
          /**
          ?????*?演出后交稅
          ?????
          */

          ????
          private ? void ?payTax()? {
          ????????System.out.println(SIGN?
          + ? " ?演出后交稅? "
          );
          ????}


          ????
          /**
          ?????*?
          @see ?java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
          ?????*??????java.lang.reflect.Method,?java.lang.Object)
          ?????
          */

          ????
          public ?Object?invoke(Object?proxy,?Method?method,?Object[]?args)
          ????????????
          throws ?Throwable?
          {
          ????????Object?obj?
          = ? null
          ;
          ????????
          // ?簽約

          ????????subcontract();
          ????????
          // ?安排藝人演出

          ????????obj? = ?method.invoke(star,?args);
          ????????
          // ?交稅

          ????????payTax();
          ????????
          return
          ?obj;
          ????}

          }

          藝人:

          /**
          ?*?藝人
          ?*?
          ?*?
          @author ?zjun
          ?*?
          @version
          ?1.0?create?on?2006-4-11?18:05:48
          ?
          */

          public ? interface ?Artist? {
          ????
          public ? void
          ?show(String?showType);
          }

          明星
          /**?
          ?*?明星
          ?*?
          ?*?
          @author?zjun
          ?*?
          @version?1.0?create?on?2006-4-11?18:08:17
          ?
          */

          public
          ? class ?Star? implements ?Artist? {
          ????
          private ?String?SIGN? = ? " ?[明星]?
          ";

          ????
          public ? void ?show(String?showType)?
          {
          ????????System.out.println(SIGN?
          +?showType);
          ????}


          }

          演出贊助商:
          /**
          ?*?演出贊助商
          ?*?
          ?*?
          @author?zjun
          ?*?
          @version?1.0?create?on?2006-4-11?18:30:25
          ?
          */

          public
          ? class ?Patron? {

          ????
          /**?*//**
          ?????*?
          @param?args
          ?????
          */

          ????public
          ? static ? void ?main(String[]?args)? {
          ????????Star?star?
          = ?
          new?Star();
          ????????BrokerHandler?broker?
          = ?
          new?BrokerHandler(star);
          ????????Artist?b?
          =?(Artist)?Proxy.newProxyInstance(star.getClass()
          ????????????????.getClassLoader(),?star.getClass().getInterfaces(),?broker);
          ????????b.show(
          " ?演電影?
          ");
          ????????b.show(
          " ?拍電視?
          ");
          ????????b.show(
          " ?出唱片?
          ");
          ????????b.show(
          " ?演唱會?
          ");

          ????}

          }

          [運行結果]:

          ? [ 經紀人工作 ]??簽訂和約?
          ?
          [ 明星
          ]??演電影?
          ?
          [ 經紀人工作
          ]??演出后交稅?
          ?
          [ 經紀人工作
          ]??簽訂和約?
          ?
          [ 明星
          ]??拍電視?
          ?
          [ 經紀人工作
          ]??演出后交稅?
          ?
          [ 經紀人工作
          ]??簽訂和約?
          ?
          [ 明星
          ]??出唱片?
          ?
          [ 經紀人工作
          ]??演出后交稅?
          ?
          [ 經紀人工作
          ]??簽訂和約?
          ?
          [ 明星
          ]??演唱會?
          ?
          [ 經紀人工作 ] ??演出后交稅?

          posted on 2006-04-12 11:06 zJun's帛羅閣 閱讀(2651) 評論(6)  編輯  收藏 所屬分類: 設計模式

          評論

          # re: [GoF23] java中的Proxy模式(續) 2006-04-12 14:34 zqc

          到底dp和裝飾模式到底有什么區別  回復  更多評論   

          # re: [GoF23] java中的Proxy模式(續) 2006-04-12 23:08 陳朋奕

          Post不多,都是精品,收到硬盤了,謝謝  回復  更多評論   

          # re: [GoF23] java中的Proxy模式(續) 2006-04-13 10:07 Harryson

          例子很形象具體.
          你那個類圖是用什么工具生成的?eclipse的插件?  回復  更多評論   

          # re: [GoF23] java中的Proxy模式(續) 2006-04-15 22:45 zJun

          @Harryson
          是的,MyEclipse4.0.1里的插件。  回復  更多評論   

          # re: [GoF23] java中的Proxy模式(續) 2006-04-15 22:48 zJun

          @陳朋奕
          謝謝,主要還是太懶,所以更新的比較慢,以后爭取多寫些。  回復  更多評論   

          # re: [GoF23] java中的Proxy模式(續) 2009-05-13 17:53 famingyuan

          哥們,你理解的很不錯  回復  更多評論   

          導航

          <2006年4月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          統計

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          博客

          文檔

          站點

          論壇

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 巍山| 张掖市| 商洛市| 文山县| 保德县| 宣威市| 历史| 沾益县| 正安县| 汝城县| 寿光市| 崇州市| 广昌县| 青铜峡市| 安仁县| 上虞市| 古蔺县| 托克托县| 绵阳市| 鲜城| 安阳县| 定襄县| 徐汇区| 武鸣县| 姚安县| 介休市| 兰西县| 衢州市| 徐汇区| 苏州市| 龙江县| 六安市| 阜阳市| 尚志市| 尤溪县| 天镇县| 安多县| 韶山市| 四子王旗| 治多县| 泌阳县|