Dev@Free

          zJun's Tech Weblog

          [GoF23] java中的Proxy模式

          代理(Proxy)模式,顧名思義就是對象之間不直接發生聯系,而是通過中間的代理人進行溝通。這種關系在現在的娛樂圈中普遍存在:明星通常都有經紀人來代理自己的演出事宜,而不是直接去聯系演出商。下面就通過這個實際中的例子來說明代理模式。
          首先畫出關系類圖


          演藝人士:包括經紀人和明星,都屬于娛樂圈中人。
          /**
          ?*?演藝人士
          ?*?
          ?*?
          @author ?zJun
          ?
          */

          public ? interface ?Artist? {
          ????
          /**
          ?????*?演出活動
          ?????
          */

          ????
          public ? void ?show(String?showType);
          }

          經紀人
          /**
          ?*?經紀人(參考《Java與模式》-?"代理(Proxy)模式"一章部分代碼)
          ?*?
          ?*?
          @author ?zJun
          ?*?
          ?
          */

          public ? class ?Broker? implements ?Artist,?InvocationHandler? {

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

          ????
          // ?旗下明星

          ???? private ?Star?star;

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

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


          ????
          /**
          ?????*?經紀人代明星打理一切演出事宜
          ?????
          */

          ????
          public ? void ?show(String?showType)? {
          ????????
          // ?簽約

          ????????subcontract();

          ????????
          // ?通知明星演出

          ???????? if ?(star? == ? null )? {
          ????????????star?
          = ? new
          ?Star();
          ????????}

          ????????star.show(showType);

          ????????
          // ?交稅
          ????????payTax();
          ????}


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

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

          }


          明星
          /**
          ?*?明星
          ?*?
          ?*?
          @author ?zJun
          ?*?
          ?
          */

          public ? class ?Star? implements ?Artist? {

          ????
          private ?String?SIGN? = ? " [明星] "
          ;

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


          }

          贊助商:通過聯系經紀人安排明星演出
          /**
          ?*?贊助商:?與經紀人聯系安排演出事宜
          ?*?
          ?*?
          @author ?zJun
          ?
          */

          public ? class ?Patron? {

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

          ????
          public ? static ? void ?main(String[]?args)? {
          ????????Broker?broker?
          = ? new
          ?Broker();
          ????????broker.show(
          " 演電影 "
          );
          ????????broker.show(
          " 拍電視 "
          );
          ????????broker.show(
          " 出唱片 "
          );
          ????????broker.show(
          " 演唱會 "
          );
          ????}


          }

          [運行結果]
          [ 經紀人 ] 簽訂和約
          [ 明星 ]
          演電影
          [ 經紀人 ]
          演出后交稅
          [ 經紀人 ]
          簽訂和約
          [ 明星 ]
          拍電視
          [ 經紀人 ]
          演出后交稅
          [ 經紀人 ]
          簽訂和約
          [ 明星 ]
          出唱片
          [ 經紀人 ]
          演出后交稅
          [ 經紀人 ]
          簽訂和約
          [ 明星 ]
          演唱會
          [ 經紀人 ] 演出后交稅

          參考資料
          《Java與模式》 閻宏 電子工業出版社

          posted on 2006-03-21 23:34 zJun's帛羅閣 閱讀(4208) 評論(4)  編輯  收藏 所屬分類: 設計模式

          評論

          # re: [GoF23] java中的Proxy模式 2006-03-22 13:59 guitarpoet

          有趣,通俗易懂,符合面向對象的概念啊,哈哈哈  回復  更多評論   

          # re: [GoF23] java中的Proxy模式 2006-03-22 14:08 guitarpoet

          不過你并沒有真正的把Java的Proxy的概念用出來。
          首先Broker不應該是Artist。
          Broker只應該是InvocationHandler,Artist代理是Proxy的newProxyInstance方法自動構造出來的,Broker自己去找Artist(當然也可以采用IOC讓Artist自己去找Broker),通過InvocationHandler的invoke方法截獲Show方法,找適應的Artist去處理。
          這個例子需要改進一下。  回復  更多評論   

          # re: [GoF23] java中的Proxy模式 2006-03-22 16:56 zJun

          @guitarpoet
          是的。原本是要接著寫Java API提供的實現Proxy模式的(就像你說的那樣通過InvocationHandler和Proxy來實現),只是昨晚時間太晚了,只好先寫到這里,先介紹Proxy的概念,留到今天再寫了。  回復  更多評論   

          # re: [GoF23] java中的Proxy模式 2008-01-23 15:22 Star

          Broker類實現InvocationHandler接口為什么不見invoke()方法?  回復  更多評論   

          導航

          <2006年3月>
          2627281234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統計

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          博客

          文檔

          站點

          論壇

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 敦煌市| 恭城| 嘉荫县| 株洲县| 清水河县| 天全县| 林周县| 房产| 奉节县| 金塔县| 曲水县| 霞浦县| 五台县| 黔江区| 江西省| 和静县| 虞城县| 景洪市| 普兰店市| 雅安市| 平谷区| 德安县| 万盛区| 黔西| 正蓝旗| 五常市| 桦南县| 双鸭山市| 化州市| 晋宁县| 新竹市| 藁城市| 石楼县| 兴城市| 余姚市| 大城县| 东丽区| 修文县| 平湖市| 平泉县| 得荣县|