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

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

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

    隨筆 - 303  文章 - 883  trackbacks - 0
    <2007年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    歡迎光臨! 
    閑聊 QQ:1074961813

    隨筆分類(357)

    我管理的群

    公共blog

    • n維空間
    • Email : java3d@126.com 群 : 12999758

    參與管理的論壇

    好友的blog

    我的其他blog

    朋友的網(wǎng)站

    搜索

    •  

    最新評(píng)論

             前面一個(gè)文章里的代碼很簡(jiǎn)單(只是讓大家了解什么是代理),實(shí)現(xiàn)的是靜態(tài)代理,做為電腦代理商的ComputerProxy,在電腦行業(yè) 為電腦生產(chǎn)商(三星,聯(lián)想)和客戶提供服務(wù),提供各種方便。
            郁悶的是,如果我現(xiàn)在增加一個(gè)行業(yè),比如下面要講到的Car汽車(chē)行業(yè),那么,我們只能增加一個(gè)代理了,也就是說(shuō)我們要再寫(xiě)一個(gè)CarProxy代碼,我們現(xiàn)在假設(shè)我們有很多個(gè)行業(yè),那么,無(wú)疑我們的工作量開(kāi)始大了,有沒(méi)有什么辦法讓我們的代理商實(shí)現(xiàn)跨行業(yè)代理呢?
            答案是:可以。這就是我們這里講的動(dòng)態(tài)代理產(chǎn)生存在的意義了。

    請(qǐng)看代碼

    在原有代碼的基礎(chǔ)上我們做了這些寬展:

    /*
    *汽車(chē)批發(fā)商
    *這樣我們的代碼中就有了電腦和汽車(chē)這兩個(gè)批發(fā)商
    */

    public interface Car {
        
    public void buyCar(String name);
    }

    /*
    *勞斯萊斯汽車(chē)公司
    */

    public class RollsRoyce implements Car {

        
    public void buyCar(String name) {
            
            System.out.println(name
    +"  勞斯萊斯公司產(chǎn)品!");
        }


    }

    /*
    *所有行業(yè)代理商
    *有了它我們的客戶可以通過(guò)他買(mǎi)個(gè)各種產(chǎn)品
    */

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class AllthingsProxy implements InvocationHandler {

        
    private Logger logger=
            Logger.getLogger(
    this.getClass().getName());
        
        
    private Object allthings;
        
        
    //實(shí)現(xiàn)對(duì)象綁定
        public Object bind(Object allthings){
            
            
    this.allthings = allthings;
            
            
    //這里傳入newProxyInstance的參數(shù)分別是 目標(biāo)object
            
    //(Lianxiang,Sanxing),interface(Computer),AllthingsProxy
            return Proxy.newProxyInstance(allthings.getClass().getClassLoader(),
                                        allthings.getClass().getInterfaces(), 
    this);
        }

        
        
    public Object invoke(Object proxy, Method method, Object[] args)
                
    throws Throwable {
            
            Object result 
    = null;
            
            
    try{
            log(
    "method starts " + method);
            
            result
    =method.invoke(allthings, args);

            logger.log(Level.INFO , 
    "method ends " + method);
            
            }
    catch(Exception e){
                log(e.toString());
            }

            
            
    return result;
        }

        
        
    private void log(String msg){
            logger.log(Level.INFO,msg);
        }


    }


    在測(cè)試類BuyAllThings中,我們通過(guò)bing方法綁定對(duì)象(所要買(mǎi)的東西),讓代理商了解到,客戶想買(mǎi)什么?
    (這里重在了解模式,具體方法的實(shí)現(xiàn)如不了解請(qǐng)自行查詢API文檔)


    /*
    *三個(gè)客戶兩個(gè)買(mǎi)電腦一個(gè)買(mǎi)汽車(chē)
    *他們找到同個(gè)代理商
    */

    public class BuyAllThing {

        
    public static void main(String[] args) {
            
            AllthingsProxy allthingsproxy 
    = new AllthingsProxy();
            
            Computer SanxingProxy
    =(Computer)allthingsproxy.bind(new Sanxing());
            
            SanxingProxy.buyComputer(
    "我想買(mǎi)一臺(tái)三星電腦");
            
            Computer lianxiangProxy
    =(Computer)allthingsproxy.bind(new Lianxiang());
            
            lianxiangProxy.buyComputer(
    "我想買(mǎi)一臺(tái)聯(lián)想電腦");
            
            Car rRollsRoyceProxy
    =(Car)allthingsproxy.bind(new RollsRoyce());
            
            RollsRoyceProxy.buyCar(
    "我想買(mǎi)一輛勞斯萊斯汽車(chē)");

        }


    }

    執(zhí)行結(jié)果

    我想買(mǎi)一臺(tái)三星電腦  三星電腦公司產(chǎn)品!
    我想買(mǎi)一臺(tái)聯(lián)想電腦  聯(lián)想電腦公司產(chǎn)品!
    我想買(mǎi)一輛勞斯萊斯汽車(chē)  勞斯萊斯公司產(chǎn)品!
    2007-8-9 13:08:41 com.lusm.spring.AllthingsProxy log
    信息: method starts 
    public abstract void com.lusm.spring.Computer.buyComputer(java.lang.String)
    2007-8-9 13:08:42 com.lusm.spring.AllthingsProxy invoke
    信息: method ends 
    public abstract void com.lusm.spring.Computer.buyComputer(java.lang.String)
    2007-8-9 13:08:42 com.lusm.spring.AllthingsProxy log
    信息: method starts 
    public abstract void com.lusm.spring.Computer.buyComputer(java.lang.String)
    2007-8-9 13:08:42 com.lusm.spring.AllthingsProxy invoke
    信息: method ends 
    public abstract void com.lusm.spring.Computer.buyComputer(java.lang.String)
    2007-8-9 13:08:42 com.lusm.spring.AllthingsProxy log
    信息: method starts 
    public abstract void com.lusm.spring.Car.buyCar(java.lang.String)
    2007-8-9 13:08:42 com.lusm.spring.AllthingsProxy invoke
    信息: method ends 
    public abstract void com.lusm.spring.Car.buyCar(java.lang.String)

    我們可以任意的增加代理商的業(yè)務(wù),比如,叫他代理電器,食物......,我們看到我們不需要更改原有的代碼。這是動(dòng)態(tài)代理帶來(lái)的好處!

    那我們的AllthingsProxy是怎么作到動(dòng)態(tài)代理的呢?

    AllthingsProxy寬展了InvocationHandler并實(shí)現(xiàn)了里面的代理方法,返回一個(gè)Object對(duì)象,

        public Object invoke(Object proxy, Method method, Object[] args)
        
    throws Throwable;

    來(lái)實(shí)現(xiàn)對(duì)汽車(chē),電腦這些批發(fā)商的動(dòng)態(tài)代理(代理商同過(guò)它 代理所有行業(yè))。

    AllthingsProxy中的bind實(shí)現(xiàn)了客戶和代理商間的通信(通過(guò)它代理商知道客戶想要買(mǎi)什么)

    這和我們 BuyAllThing 測(cè)試類main中

    代理對(duì)象=(綁定對(duì)象)allthingsproxy.bind(綁定對(duì)象(客戶想買(mǎi)的東西))

    想對(duì)應(yīng)。

             呵呵 ,講完了!也許有的朋友看不懂這里在說(shuō)什么? 不必著急,學(xué)習(xí)都需要過(guò)程,等你的學(xué)習(xí)到某個(gè)階段的時(shí)候,回頭想想,也許認(rèn)識(shí)就會(huì)加深許多,本人覺(jué)得Java是比較高級(jí)的語(yǔ)言,自身的發(fā)展也只直遵循著軟件設(shè)計(jì)優(yōu)化(代碼重用)方向發(fā)展,重視設(shè)計(jì)思想,而不是去改變語(yǔ)言的語(yǔ)法或接口api,這是許多語(yǔ)言所缺乏的,如一個(gè)在VC6中編寫(xiě)的代碼,拿到Visual Studio2005,Visual Studio2008去運(yùn)行很容易出現(xiàn)問(wèn)題。

           也許你并不清楚我在說(shuō)什么?但是這一切會(huì)在你的Spring學(xué)習(xí)中漸漸清楚起來(lái)!

           以后的代碼可能需要必要的IDE才能使用,本人使用的是:
           MyEclipse6.0M1+Eclipse3.3 
           數(shù)據(jù)庫(kù)用的是:
          Oralce10g或者M(jìn)ysql6.0

          祝你好運(yùn)氣!!!







    地震讓大伙知道:居安思危,才是生存之道。
    posted on 2007-08-09 13:49 小尋 閱讀(1474) 評(píng)論(5)  編輯  收藏 所屬分類: j2se/j2ee/j2me

    FeedBack:
    # re: [系列] 說(shuō)故事學(xué)設(shè)計(jì)模式 之 ::Java動(dòng)態(tài)代理模式 :: 2009-03-15 19:14 neu
    挺好,思路清晰  回復(fù)  更多評(píng)論
      
    # re: [系列] 說(shuō)故事學(xué)設(shè)計(jì)模式 之 ::Java動(dòng)態(tài)代理模式 ::[未登錄](méi) 2009-06-14 14:16 bc
    cat 和 car都分不清楚,還講什么設(shè)計(jì)模式.  回復(fù)  更多評(píng)論
      
    # re: [系列] 說(shuō)故事學(xué)設(shè)計(jì)模式 之 ::Java動(dòng)態(tài)代理模式 ::[未登錄](méi) 2009-06-17 14:31 尋覓
    太不好意思老 改過(guò)來(lái)改過(guò)來(lái)
      回復(fù)  更多評(píng)論
      
    # re: [系列] 說(shuō)故事學(xué)設(shè)計(jì)模式 之 ::Java動(dòng)態(tài)代理模式 :: 2009-09-23 10:17 另一個(gè)天堂
    講得很好,只是我還是沒(méi)弄清動(dòng)態(tài)代理相對(duì)于靜態(tài)代理的好處...
    呵呵,我再看一遍你的文章.
    順便說(shuō)下,你這邊文章我準(zhǔn)備轉(zhuǎn)載了~  回復(fù)  更多評(píng)論
      
    # re: [系列] 說(shuō)故事學(xué)設(shè)計(jì)模式 之 ::Java動(dòng)態(tài)代理模式 :: 2009-09-23 10:38 另一個(gè)天堂
    又看了一遍,基本搞定了,呵呵。謝謝樓主了!  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲在成人网在线看| 亚洲国产区男人本色在线观看| 77777午夜亚洲| 无人视频免费观看免费视频| 中文字幕视频免费| 免费国内精品久久久久影院| 亚洲A∨无码无在线观看| 亚洲经典千人经典日产| 国产日韩一区二区三免费高清| 永久免费av无码不卡在线观看| 久久久久久久亚洲精品| 亚洲五月综合缴情婷婷| 国产真人无码作爱免费视频| 成年女人免费v片| 国产亚洲精品观看91在线| 亚洲中文无码卡通动漫野外| 最近的2019免费中文字幕| 成年女人看片免费视频播放器| 亚洲中文字幕久久精品无码喷水| 国产精品亚洲精品青青青| 福利免费在线观看| 卡1卡2卡3卡4卡5免费视频| 久久久无码精品亚洲日韩蜜桃| 色婷婷亚洲一区二区三区| 18级成人毛片免费观看| av在线亚洲欧洲日产一区二区| 激情综合亚洲色婷婷五月| 国产一级片免费看| 免费又黄又爽又猛的毛片| 亚洲另类精品xxxx人妖| 中文字幕无码一区二区免费| 免费看国产一级片| 亚洲1区1区3区4区产品乱码芒果| 免费看成人AA片无码视频吃奶| 无码不卡亚洲成?人片| 在线综合亚洲欧洲综合网站| 91精品国产免费入口| 亚洲日韩小电影在线观看| 老司机午夜在线视频免费观| 思思99re66在线精品免费观看| 色婷婷六月亚洲婷婷丁香|