Dev@Free

          zJun's Tech Weblog

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

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

          可以看出,這里并沒有經(jīng)紀(jì)人(Broke)類,而是新增了一個(gè)經(jīng)紀(jì)人操作類(BrokeHandler),這是因?yàn)橥ㄟ^Proxy.newProxyInstance()方法,Java API將自動(dòng)為我們生成一個(gè)對(duì)于Artist接口的代理類(即:Broke),我們只需定義代理的操作即可.

          經(jīng)紀(jì)人工作:

          /**
          ?*?經(jīng)紀(jì)人工作
          ?*?
          ?*?
          @author ?zjun
          ?*?
          @version
          ?1.0?create?on?2006-4-11?18:06:36
          ?
          */

          public ? class ?BrokerHandler? implements ?InvocationHandler? {

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

          ????
          // ?旗下明星

          ???? 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(
          " ?演唱會(huì)?
          ");

          ????}

          }

          [運(yùn)行結(jié)果]:

          ? [ 經(jīng)紀(jì)人工作 ]??簽訂和約?
          ?
          [ 明星
          ]??演電影?
          ?
          [ 經(jīng)紀(jì)人工作
          ]??演出后交稅?
          ?
          [ 經(jīng)紀(jì)人工作
          ]??簽訂和約?
          ?
          [ 明星
          ]??拍電視?
          ?
          [ 經(jīng)紀(jì)人工作
          ]??演出后交稅?
          ?
          [ 經(jīng)紀(jì)人工作
          ]??簽訂和約?
          ?
          [ 明星
          ]??出唱片?
          ?
          [ 經(jīng)紀(jì)人工作
          ]??演出后交稅?
          ?
          [ 經(jīng)紀(jì)人工作
          ]??簽訂和約?
          ?
          [ 明星
          ]??演唱會(huì)?
          ?
          [ 經(jīng)紀(jì)人工作 ] ??演出后交稅?

          posted on 2006-04-12 11:06 zJun's帛羅閣 閱讀(2659) 評(píng)論(6)  編輯  收藏 所屬分類: 設(shè)計(jì)模式

          評(píng)論

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

          到底dp和裝飾模式到底有什么區(qū)別  回復(fù)  更多評(píng)論   

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

          Post不多,都是精品,收到硬盤了,謝謝  回復(fù)  更多評(píng)論   

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

          例子很形象具體.
          你那個(gè)類圖是用什么工具生成的?eclipse的插件?  回復(fù)  更多評(píng)論   

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

          @Harryson
          是的,MyEclipse4.0.1里的插件。  回復(fù)  更多評(píng)論   

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

          @陳朋奕
          謝謝,主要還是太懶,所以更新的比較慢,以后爭(zhēng)取多寫些。  回復(fù)  更多評(píng)論   

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

          哥們,你理解的很不錯(cuò)  回復(fù)  更多評(píng)論   


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


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊(cè)

          收藏夾

          博客

          文檔

          站點(diǎn)

          論壇

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 兴安盟| 临湘市| 称多县| 灵丘县| 承德县| 阳朔县| 吕梁市| 淮安市| 石阡县| 柯坪县| 承德县| 石林| 诏安县| 汶上县| 额济纳旗| 黑龙江省| 尼木县| 新丰县| 临朐县| 海城市| 庆阳市| 平原县| 寿阳县| 仁布县| 普兰店市| 岳普湖县| 新郑市| 临洮县| 吉林省| 铜梁县| 南京市| 万宁市| 禄劝| 保德县| 海丰县| 潮安县| 新丰县| 罗定市| 汝阳县| 昭平县| 兴安县|