<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模式(續)

    上一篇隨筆 中,由于時間和篇幅的關系只是簡單介紹了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帛羅閣 閱讀(2650) 評論(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)

    隨筆分類

    隨筆檔案

    相冊

    收藏夾

    博客

    文檔

    站點

    論壇

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产亚洲综合视频| 亚洲AV无码专区国产乱码不卡| 一级毛片视频免费| 免费人成年激情视频在线观看 | 亚洲第一成人在线| 99久久这里只精品国产免费| 亚洲国产成人精品无码一区二区 | 在线免费视频一区二区| 亚洲乱妇老熟女爽到高潮的片| 成人免费无毒在线观看网站 | 成年女人毛片免费观看97| 国产 亚洲 中文在线 字幕| 久久不见久久见中文字幕免费 | 亚洲欧洲日韩极速播放 | 中文字幕人成人乱码亚洲电影| 毛片基地看看成人免费| 亚洲AV无码一区二区乱子伦| 久9久9精品免费观看| 亚洲国产成AV人天堂无码| 青青草国产免费久久久91| 成人a毛片视频免费看| 亚洲精品乱码久久久久久久久久久久 | 亚洲高清无在码在线无弹窗| 青青视频观看免费99| 美景之屋4在线未删减免费| 国产亚洲日韩一区二区三区| 日韩插啊免费视频在线观看| 国产91在线|亚洲| 亚洲AV蜜桃永久无码精品| 美女视频黄的免费视频网页| 精品亚洲AV无码一区二区| 亚洲国产日韩在线观频| 一区二区三区在线免费看| 亚洲人成色在线观看| 精品国产亚洲一区二区在线观看| 香蕉成人免费看片视频app下载| 亚洲AV成人影视在线观看| 亚洲AV无码乱码在线观看牲色| 免费无码中文字幕A级毛片| 精品一区二区三区无码免费直播| 亚洲av网址在线观看|