<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帛羅閣 閱讀(2660) 評論(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)

    隨筆分類

    隨筆檔案

    相冊

    收藏夾

    博客

    文檔

    站點

    論壇

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲欧洲国产精品久久| 国产亚洲精品久久久久秋霞| 亚洲精品福利在线观看| 久久综合国产乱子伦精品免费| 亚洲乱码中文字幕综合| 两个人的视频www免费| 亚洲熟女少妇一区二区| 午夜影院免费观看| 91嫩草私人成人亚洲影院| 久久亚洲免费视频| 亚洲男女性高爱潮网站| 无码国产精品一区二区免费式影视| 亚洲网址在线观看| 国产片AV片永久免费观看| 亚洲最大无码中文字幕| 国产美女无遮挡免费视频| 国产亚洲漂亮白嫩美女在线| 亚洲精品高清一二区久久| 国产黄在线播放免费观看| 亚洲成av人片天堂网| 蜜臀AV免费一区二区三区| 中中文字幕亚洲无线码| 国产一区二区三区在线免费| 日韩大片在线永久免费观看网站| 久久精品国产亚洲Aⅴ香蕉| 暖暖日本免费中文字幕| 亚洲第一成人在线| 国产片免费在线观看| 国产在线精品一区免费香蕉| 久久亚洲春色中文字幕久久久| 免费国产作爱视频网站| 特级做a爰片毛片免费看| 亚洲高清国产拍精品26U| 四虎精品视频在线永久免费观看| 亚洲午夜在线播放| 亚洲第一区精品日韩在线播放| 免费视频精品一区二区三区| 456亚洲人成影院在线观| 精品国产日韩亚洲一区| 曰曰鲁夜夜免费播放视频 | 免费看国产精品麻豆|