<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 閱讀(1440) 評論(0)  編輯  收藏 所屬分類: 模式與重構
    <2008年1月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點博客

    好友博客

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 在线a级毛片免费视频| 久久久久亚洲精品中文字幕| 亚洲爆乳大丰满无码专区| 亚洲精品高清在线| 亚洲美女免费视频| 国产午夜亚洲精品不卡| 久久91亚洲精品中文字幕| 热99re久久精品精品免费| 中文字幕在线成人免费看| 亚洲avav天堂av在线网爱情| 亚洲日韩在线观看| 57PAO成人国产永久免费视频| 乱淫片免费影院观看| 亚洲国产精品免费在线观看| 亚洲美女在线国产| 无码中文字幕av免费放| 男人天堂免费视频| 亚洲av无码日韩av无码网站冲| 亚洲中文字幕无码爆乳AV| 免费观看大片毛片| 久久国产免费福利永久| 国产在线观a免费观看| 亚洲国产成人AV在线播放| 综合自拍亚洲综合图不卡区| 亚洲一区二区三区国产精品| 无码视频免费一区二三区| 日本免费一区二区久久人人澡| 色多多免费视频观看区一区| 91丁香亚洲综合社区| 亚洲人成在线播放网站岛国| 亚洲伊人久久综合中文成人网| 成人黄动漫画免费网站视频| 91精品国产免费入口| 中文在线免费视频| 免费国产草莓视频在线观看黄| 91丁香亚洲综合社区| 亚洲制服丝袜一区二区三区| 亚洲av日韩av高潮潮喷无码| 在线A亚洲老鸭窝天堂| 亚洲高清无码综合性爱视频| 日韩视频免费一区二区三区|