<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
    適配器的幾種用法

    一、要適配的功能來自兩個互不關聯的類

    例如:

    public class A { public void someFunctionOfA();}

    public class B { public void someFunctionOfB();}

    適配器的設計如下

    public class C extends A {

        private class B b ;

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

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



    我們知道因為Java中不允許多重繼承,所以這里類C首先繼承了類A,這樣它就具有了類A的功能了,特別是我們要注意到類C中包含了一個類B的成員變量,這樣類C也間接地具有了類B的功能(因為類C要實現的功能實際是委托其成員變量b來完成) 。


    二、要適配的功能來自兩個互不關聯的接口,其目前沒有實現類

    例如:

    public interface A { public void someFunctionOfA(); }

    public interface B { public void someFunctionOfB(); }

    適配器的設計如下

    public class C implements A, C {

        public void someFunctionOfA(){....}

        public void someFunctionOfB(){....}  

    }

    這是最簡單也是最常用的方式,但只適合于目前沒有實現類的情況,如果我們的系統已經有了實現類,要再在新適配器里面重新實現,無異于重新發明車輪。


    三、要適配的功能來自兩個互不關聯的接口,但已經有實現類

    這種情況和情況一很像,但方式一強迫適配器必須繼承其中某一個類,那么以后適配器的子類將不能繼承其它的父類,但是因為有了接口,我們可以使用“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沒有繼承那一個特定的類,相反它實現了所有的接口,但它重載了構造方法,我們可以根據需要來讓適配器適配想要的功能。

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

    這樣的好處就是適配器是動態的,我們可以控制適配器在某個適合適配某個想要的功能,而不會像方式一一樣不管三七二十一,把所有的功能都實現了。


    四、要適配的功能來自一個類和一個接口

    例如:

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

    public interface B { public void someFunctionOfB(); }

    適配器的設計如下

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

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

    }

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


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

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點博客

    好友博客

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费人成视频在线播放| 亚洲中文字幕无码久久| 日批视频网址免费观看| 久久亚洲中文字幕精品一区四| 久久亚洲精品无码gv| 国产精品免费播放| 亚洲AV无码AV男人的天堂不卡| 精品久久洲久久久久护士免费| 亚洲精品无码国产片| 日日操夜夜操免费视频| 在线观看亚洲电影| 亚洲国产免费综合| 成年网在线观看免费观看网址 | 99热在线精品免费播放6| 色播亚洲视频在线观看| 日韩精品内射视频免费观看| 亚洲视频在线不卡| 国产精品视频永久免费播放| 亚洲av永久中文无码精品综合 | 国内精品久久久久久久亚洲| 97国免费在线视频| 99久久精品国产亚洲| 37pao成人国产永久免费视频 | 少妇亚洲免费精品| 99re6在线精品免费观看| 久久精品亚洲精品国产色婷| 91免费国产在线观看| 小说专区亚洲春色校园| 亚洲热妇无码AV在线播放| 一区二区免费视频| 最新国产精品亚洲| 亚洲午夜AV无码专区在线播放 | 亚洲成av人片一区二区三区| 三级网站免费观看| 亚洲日韩一区二区三区| 亚洲国产成人久久笫一页| 99在线观看精品免费99| 国产亚洲欧美在线观看| 亚洲视频一区调教| 国产免费av片在线无码免费看 | 成人在线免费观看|