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

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

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

    posts - 262,  comments - 221,  trackbacks - 0
    適配器的幾種用法

    一、要適配的功能來(lái)自兩個(gè)互不關(guān)聯(lián)的類

    例如:

    public class A { public void someFunctionOfA();}

    public class B { public void someFunctionOfB();}

    適配器的設(shè)計(jì)如下

    public class C extends A {

        private class B b ;

        public C (B b) { this.b = b; }

        public someFunctionOfAandB () {
            super.someFunctionOfA();
            b.someFunctionOfB();
        } 



    我們知道因?yàn)镴ava中不允許多重繼承,所以這里類C首先繼承了類A,這樣它就具有了類A的功能了,特別是我們要注意到類C中包含了一個(gè)類B的成員變量,這樣類C也間接地具有了類B的功能(因?yàn)轭怌要實(shí)現(xiàn)的功能實(shí)際是委托其成員變量b來(lái)完成) 。


    二、要適配的功能來(lái)自兩個(gè)互不關(guān)聯(lián)的接口,其目前沒(méi)有實(shí)現(xiàn)類

    例如:

    public interface A { public void someFunctionOfA(); }

    public interface B { public void someFunctionOfB(); }

    適配器的設(shè)計(jì)如下

    public class C implements A, C {

        public void someFunctionOfA(){....}

        public void someFunctionOfB(){....}  

    }

    這是最簡(jiǎn)單也是最常用的方式,但只適合于目前沒(méi)有實(shí)現(xiàn)類的情況,如果我們的系統(tǒng)已經(jīng)有了實(shí)現(xiàn)類,要再在新適配器里面重新實(shí)現(xiàn),無(wú)異于重新發(fā)明車(chē)輪。


    三、要適配的功能來(lái)自兩個(gè)互不關(guān)聯(lián)的接口,但已經(jīng)有實(shí)現(xiàn)類

    這種情況和情況一很像,但方式一強(qiáng)迫適配器必須繼承其中某一個(gè)類,那么以后適配器的子類將不能繼承其它的父類,但是因?yàn)橛辛私涌冢覀兛梢允褂?#8220;two-way-adpater”的方式

    例如:

    public interface Ia { public void someFunctionOfA(); }

    public interface Ib { public void someFunctionOfB(); }

    public class A implements Ia { public void someFunctionOfA(){...} }

    public class B implements Ib { public void someFunctionOfB(){...} }

    public class C implements Ia, Ib {

        private Ia ia ;
        private Ib ib ;

        public C(Ia ia) { this.ia = ia;}

        public C(Ib ib) { this.ib = ib;}

        public void someFunctionOfA(){  
            ia.someFunctionOfA();
        }

        public void someFunctionOfB(){
            ib.someFunctionOfB();
        }

    }

    我們可以看到這里適配器C沒(méi)有繼承那一個(gè)特定的類,相反它實(shí)現(xiàn)了所有的接口,但它重載了構(gòu)造方法,我們可以根據(jù)需要來(lái)讓適配器適配想要的功能。

    比如:現(xiàn)在我們想讓適配器適配接口Ia的功能,那么我們將調(diào)用適配器的public C(Ia ia),傳入一個(gè)Ia接口的實(shí)例,再調(diào)用someFunctionOfA();如果我們想要適配接口Ib的功能,那么只需要調(diào)用構(gòu)造方法public C(Ib ib),再調(diào)用someFunctionOfB()。

    這樣的好處就是適配器是動(dòng)態(tài)的,我們可以控制適配器在某個(gè)適合適配某個(gè)想要的功能,而不會(huì)像方式一一樣不管三七二十一,把所有的功能都實(shí)現(xiàn)了。


    四、要適配的功能來(lái)自一個(gè)類和一個(gè)接口

    例如:

    public class A { public void someFunctionOfA(){....}}

    public interface B { public void someFunctionOfB(); }

    適配器的設(shè)計(jì)如下

    public class C extends A implements B {
       
      public void someFunctionOfB(){...}

        public void someFunctionOfAandB(){
            super.someFunctionOfA();
            someFunctionOfB();
       }

    }

    從上面的四種方式來(lái)看,方式二最簡(jiǎn)單也最常用,方式三最靈活,方式一和四有相同的地方就是都繼承了其中的某一個(gè)類,這樣就限制了適配器的子類不能再繼承其它的功能父類了,不同的地方是方式一使用委托的方式來(lái)完成類B的功能,而方式四則自己實(shí)現(xiàn)了接口的方法。


    -------------------------------------------------------------
    生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
    posted on 2008-01-14 17:50 Paul Lin 閱讀(1446) 評(píng)論(0)  編輯  收藏 所屬分類: 模式與重構(gòu)
    <2008年1月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點(diǎn)博客

    好友博客

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 国产亚洲自拍一区| 成年18网站免费视频网站 | 久久国产成人亚洲精品影院| 亚洲国产AV无码一区二区三区| 亚洲视频一区调教| 久久精品成人免费国产片小草| 69精品免费视频| 亚洲视频免费观看| 一级毛片免费视频网站| 亚洲国产精品无码久久久久久曰| 日日狠狠久久偷偷色综合免费| 亚洲国产精品一区二区九九| 一个人看的www在线免费视频| 337p日本欧洲亚洲大胆裸体艺术| 巨胸狂喷奶水视频www网站免费| 亚洲一区精品无码| 日韩在线永久免费播放| 亚洲专区中文字幕| 国产伦一区二区三区免费 | 久久久精品免费国产四虎| 亚洲成AV人片在线观看ww| 最近中文字幕完整版免费高清| ass亚洲**毛茸茸pics| 蜜臀91精品国产免费观看| 人人狠狠综合久久亚洲婷婷| 高清一区二区三区免费视频| 91亚洲自偷在线观看国产馆| 日韩精品视频免费在线观看| 特a级免费高清黄色片| 久久亚洲精品中文字幕三区| 波多野结衣免费在线| 无码亚洲成a人在线观看| 亚洲日韩一页精品发布| 美女内射毛片在线看免费人动物| 中日韩亚洲人成无码网站| 亚洲国产精品激情在线观看| 久久99国产乱子伦精品免费| 亚洲av最新在线观看网址| 国产亚洲成av片在线观看| 在线观看免费人成视频色9 | 久9久9精品免费观看|