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

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 兴宁市| 德江县| 昭通市| 汨罗市| 佛冈县| 德安县| 镇坪县| 高淳县| 枝江市| 台中市| 吉安县| 小金县| 玛多县| 汪清县| 寿宁县| 明水县| 年辖:市辖区| 电白县| 蚌埠市| 西藏| 永嘉县| 阳泉市| 金川县| 河源市| 德化县| 左权县| 玉溪市| 铜鼓县| 奈曼旗| 老河口市| 信宜市| 堆龙德庆县| 将乐县| 定边县| 古交市| 巢湖市| 武汉市| 浠水县| 纳雍县| 正宁县| 苗栗县|