<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Dev@Free

    zJun's Tech Weblog

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

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

    可以看出,這里并沒有經(jīng)紀(jì)人(Broke)類,而是新增了一個經(jīng)紀(jì)人操作類(BrokeHandler),這是因為通過Proxy.newProxyInstance()方法,Java API將自動為我們生成一個對于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(
    " ?演唱會?
    ");

    ????}

    }

    [運行結(jié)果]:

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

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

    評論

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

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

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

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

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

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

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

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

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

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

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

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


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


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

    導(dǎo)航

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

    統(tǒng)計

    常用鏈接

    留言簿(15)

    隨筆分類

    隨筆檔案

    相冊

    收藏夾

    博客

    文檔

    站點

    論壇

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品国产高清不卡在线| 人体大胆做受免费视频| 免费毛片在线看不用播放器 | 伊伊人成亚洲综合人网7777| 国产成人高清精品免费观看| 在线亚洲精品福利网址导航| 国内一级一级毛片a免费| 亚洲综合一区二区三区四区五区 | 亚洲大尺码专区影院| 操美女视频免费网站| 亚洲6080yy久久无码产自国产| 手机看片久久国产免费| 无码毛片一区二区三区视频免费播放 | 亚洲欧洲日产v特级毛片| 国产精品亚洲аv无码播放| 99久久久国产精品免费牛牛四川 | 手机看黄av免费网址| 国产亚洲欧美在线观看| 亚洲综合激情另类专区| 亚洲高清免费在线观看| 国产精品亚洲四区在线观看 | 亚洲无人区码一二三码区别图片| 亚洲黄色在线网站| 青青青青青青久久久免费观看| 久久性生大片免费观看性| 亚洲成a人片在线观| 亚洲五月六月丁香激情| 在线观看国产情趣免费视频| 免费不卡视频一卡二卡| 男女做羞羞的事视频免费观看无遮挡 | 巨胸喷奶水视频www网免费| 久久电影网午夜鲁丝片免费| 国产福利免费视频 | 国产一区二区三区免费在线观看| 好吊色永久免费视频大全| 免费又黄又爽又猛大片午夜| 亚洲无限乱码一二三四区| 666精品国产精品亚洲| 亚洲视频在线观看地址| 亚洲欧洲视频在线观看| 浮力影院亚洲国产第一页|