greatjone

          BlogJava 聯(lián)系 聚合 管理
            7 Posts :: 24 Stories :: 3 Comments :: 0 Trackbacks

          1.類適配器
              使用情況:利用第三方類來(lái)完成給定的接口期望。

              示例演示:        

             首先有一個(gè)接口,期望用這個(gè)接口來(lái)實(shí)現(xiàn)求和操作:

          1public interface Operation{   
          2      public int add(int a,int b);   
          3}
            
          4
                現(xiàn)在發(fā)現(xiàn)一個(gè)第三方類,它有一個(gè)方法剛好實(shí)現(xiàn)了Operationadd方法。
          1public class OtherOperation{   
          2      public int otherAdd(int a,int b){   
          3           return a + b;   
          4      }
             
          5}
            
          6
              為了利用第三方類來(lái)實(shí)現(xiàn)Operation的期望,我們可以采用如下方式:
          1public class AdapterOperation extends OtherOperation implements Operation{   
          2      public int add(int a,int b){   
          3           return otherAdd(a,b);   
          4      }
             
          5}
            
          6
              以上就是適配器的實(shí)現(xiàn)方法之一,類適配器。它就是用適配器類去繼承已有的第三方類,然后第三方類的方法來(lái)實(shí)現(xiàn)預(yù)期的功能。

          2.對(duì)象適配器
              使用情況一:當(dāng)給定的接口功能比較多時(shí),并且第三方的實(shí)現(xiàn)類也比較多時(shí),就無(wú)法利用類適配器的方式來(lái)實(shí)現(xiàn)預(yù)期功能了,這時(shí)可采用對(duì)象適配器方式。
              示例演示:假如客戶接口期望的功能不止一個(gè),而是多個(gè):
          1public interface Operation{   
          2      public int add(int a,int b);   
          3      public int minus(int a,int b);   
          4      public int multiplied(int a,int b);   
          5}
            
          6
              而能提供這些實(shí)現(xiàn)的原可能不止一個(gè):
           1public class OtherAdd{   
           2      public int otherAdd(int a,int b){   
           3           return a + b;   
           4      }
             
           5}
             
           6  
           7public class OtherMinus{   
           8      public int minus(int a,int b){   
           9           return a - b;   
          10      }
             
          11}
             
          12  
          13public class OtherMultiplied{   
          14      public int multiplied(int a,int b){   
          15           return a * b;   
          16      }
             
          17}
            
          18
              由于java是不能實(shí)現(xiàn)多繼承的,所以我們不能通過(guò)構(gòu)建一個(gè)適配器,讓他來(lái)繼承所有原以完成我們的期望,這時(shí)候怎么辦呢?只能用適配器的另一種實(shí)現(xiàn)--對(duì)象適配器
           1public class AdapterOperation implements Operation{   
           2      private OtherAdd add;   
           3      private OtherMinus minus;   
           4      private OtherMultiplied multiplied;   
           5  
           6      public void setAdd(OtherAdd add){   
           7            this.add = add;   
           8      }
             
           9  
          10      public void setMinus(OtherMinus minus){   
          11            this.minus = minus;   
          12      }
             
          13  
          14      public void setMultiplied(OtherMultiplied multiplied){   
          15            this.multiplied = multiplied;   
          16      }
             
          17  
          18      //適配加法運(yùn)算   
          19      public int add(int a,int b){   
          20           return add.otherAdd(a,b);   
          21      }
             
          22  
          23      //適配減法運(yùn)算   
          24      public int minus(int a,int b){   
          25          return minus.minus(a,b);   
          26      }
             
          27  
          28      //適配乘法運(yùn)算   
          29      public int multiplied(int a,int b){   
          30         return multiplied.multiplied(a,b);   
          31      }
             
          32}
            
          33
              上面代碼很明顯,適配器并不是通過(guò)繼承來(lái)獲取適配類(原)的功能的,而是通過(guò)適配類的對(duì)象來(lái)獲取的,這就解決了java不能多繼承所帶來(lái)的不便了。這也是java提倡的編程思想之一,即盡量使用聚合不要使用繼承

          使用情況二:所提供的需求并不是一個(gè)明確的接口,而是一個(gè)類B,并沒有定義期望的方法,并且要求B能夠何留類A的功能,如下 :
          public class A{   
             
          public int add(int a,int b){   
                
          return a + b;   
             }
             
          }
            
          public class B extends A{   
              b()
          {   
                
          super();   
              }
             
            
              
          public int minus(int a,int b){   
                     
          //待實(shí)現(xiàn)的減法運(yùn)算函數(shù)..   
              }
             
          }
            
              在類B中我是通過(guò)繼承的方式來(lái)保留A的功能。
              這時(shí)候,我們發(fā)現(xiàn)類C已經(jīng)提供了實(shí)現(xiàn)減法的函數(shù)。
          1public class C{   
          2    public int minus(int a,int b){   
          3           return a - b;   
          4    }
             
          5}
            
          6
              為了避免重復(fù)去設(shè)計(jì)該函數(shù),我們決定引入C類,通過(guò)適配C類來(lái)達(dá)到我們的期望,但問(wèn)題是A和C都是一個(gè)具體類,我們無(wú)法讓B同時(shí)繼承這個(gè)兩個(gè)類,而B繼承A又是必須的,所以我們只能考慮把C給內(nèi)聚到B內(nèi)部,對(duì)象適配器又得派上用場(chǎng)了。
           1public class B extends A{   
           2  
           3    private C c;   
           4  
           5    B(){   
           6      super();   
           7    }
             
           8  
           9    public void setMinus(C c){   
          10         this.c= c;   
          11    }
             
          12  
          13    public int minus(int a,int b){   
          14           return c.minus(a,b);   
          15    }
             
          16}
            
          17

          3.隱藏目標(biāo)接口的抽象適配器 
              一個(gè)接口中有多個(gè)抽象方法,而在實(shí)際情況中,所用到的實(shí)現(xiàn)類并不一定要實(shí)現(xiàn)它的所有方法,在這種情況下,為避免在書定實(shí)現(xiàn)類的多余代碼,可以預(yù)先給定一個(gè)抽象的適配器類,這個(gè)類實(shí)現(xiàn)了接口的所有方法,并且所有的實(shí)現(xiàn)都是空實(shí)現(xiàn)。


          posted on 2010-06-07 18:25 jone 閱讀(197) 評(píng)論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 通榆县| 淳安县| 梧州市| 连城县| 马山县| 宝兴县| 鹤岗市| 丹巴县| 高安市| 岳阳市| 石阡县| 河西区| 大同市| 丰县| 明水县| 杭州市| 平遥县| 河西区| 五大连池市| 钟祥市| 鄄城县| 象山县| 嘉义县| 玉树县| 宁陵县| 海阳市| 大港区| 谷城县| 乌鲁木齐县| 枞阳县| 泽库县| 邓州市| 阿巴嘎旗| 水富县| 灌南县| 古蔺县| 张家口市| 云和县| 九寨沟县| 斗六市| 财经|