Dev@Free

          zJun's Tech Weblog

          [GoF23] java中的Proxy模式

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


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

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

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

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

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

          ????
          private ?String?SIGN? = ? " [經(jīng)紀人] "
          ;

          ????
          // ?旗下明星

          ???? private ?Star?star;

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

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


          ????
          /**
          ?????*?經(jīng)紀人代明星打理一切演出事宜
          ?????
          */

          ????
          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);
          ????}


          }

          贊助商:通過聯(lián)系經(jīng)紀人安排明星演出
          /**
          ?*?贊助商:?與經(jīng)紀人聯(lián)系安排演出事宜
          ?*?
          ?*?
          @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(
          " 演唱會 "
          );
          ????}


          }

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

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

          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提供的實現(xiàn)Proxy模式的(就像你說的那樣通過InvocationHandler和Proxy來實現(xiàn)),只是昨晚時間太晚了,只好先寫到這里,先介紹Proxy的概念,留到今天再寫了。  回復  更多評論   

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

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


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           

          導航

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

          統(tǒng)計

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          博客

          文檔

          站點

          論壇

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 广水市| 泰和县| 贞丰县| 娱乐| 鄂尔多斯市| 栾川县| 浏阳市| 南木林县| 时尚| 洛浦县| 拉孜县| 尼木县| 西峡县| 安国市| 贵阳市| 桦川县| 剑川县| 大新县| 读书| 桓台县| 卓尼县| 双鸭山市| 芒康县| 北辰区| 金湖县| 南城县| 昭觉县| 韩城市| 浮梁县| 安多县| 班玛县| 秦安县| 河北省| 高台县| 塔城市| 宽城| 班玛县| 剑阁县| 昆明市| 磐安县| 凤城市|