• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            為生存而奔跑

               :: 首頁 :: 聯系 :: 聚合  :: 管理
              271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

            留言簿(5)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 326887
            • 排名 - 74

            最新評論

            閱讀排行榜

            評論排行榜

            類適配器
            客戶的開發人員定義了一個接口,期望用這個接口來完成整數的求和操作,接口定義如下:
            Java代碼
            1. public interface Operation{  
            2.       public int add(int a,int b);  
            3. }  

            開發人員在了解這個接口的定義后,發現一個第三方類,里面有一個方法能實現他們期望的功能,其代碼如下:
            Java代碼
            1. public class OtherOperation{  
            2.       public int otherAdd(int a,int b){  
            3.            return a + b;  
            4.       }  
            5. }  

            以上第三方類OtherOperation的方法public int otherAdd(int a,int b)所提供的功能,完全能符合客戶的期望,所以只需要想辦法把OtherOperationotherAdd(int a,int b)和客戶的Operation接口聯系起來,讓這個第三方類來為客戶提供他們期望的服務就行了,這樣就避免了開發人員再度去研究類似OtherOperationotherAdd(int a,int b)方法的實現(利用已有的輪子,避免重復發明),這方法之一,就是用適配器模式:
            Java代碼
            1. public class AdapterOperation extends OtherOperation implements Operation{  
            2.       public int add(int a,int b){  
            3.            return otherAdd(a,b);  
            4.       }  
            5. }  

            以上就是適配器的實現方法之一,類適配器,在以上實現中存在著三中角色分別是:
            1:適配目標角色:Operation。
            2:適配類(原)角色:OtherOperation。
            3:適配器角色:AdapterOperation。
            其中適配器角色是適配器模式的核心。
            適配器的主要工作就是通過封裝現有的功能,使他滿足需要的接口。

            對象適配器
            我們再來看看另一種情況:
            假如客戶接口期望的功能不止一個,而是多個:
            Java代碼
            1. public 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. }  

            而能提供這些實現的原可能不止一個:
            Java代碼
            1. public class OtherAdd{  
            2.       public int otherAdd(int a,int b){  
            3.            return a + b;  
            4.       }  
            5. }  
            6.   
            7. public class OtherMinus{  
            8.       public int minus(int a,int b){  
            9.            return a - b;  
            10.       }  
            11. }  
            12.   
            13. public class OtherMultiplied{  
            14.       public int multiplied(int a,int b){  
            15.            return a * b;  
            16.       }  
            17. }  

            由于java是不能實現多繼承的,所以我們不能通過構建一個適配器,讓他來繼承所有原以完成我們的期望,這時候怎么辦呢?只能用適配器的另一種實現--對象適配器
            Java代碼
            1. public 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.       //適配加法運算  
            19.       public int add(int a,int b){  
            20.            return add.otherAdd(a,b);  
            21.       }  
            22.   
            23.       //適配減法運算  
            24.       public int minus(int a,int b){  
            25.           return minus.minus(a,b);  
            26.       }  
            27.   
            28.       //適配乘法運算  
            29.       public int multiplied(int a,int b){  
            30.          return multiplied.multiplied(a,b);  
            31.       }  
            32. }  

            上面代碼很明顯,適配器并不是通過繼承來獲取適配類(原)的功能的,而是通過適配類的對象來獲取的,這就解決了java不能多繼承所帶來的不便了。這也是java提倡的編程思想之一,即盡量使用聚合不要使用繼承
            還有一種情況是需要使用對象適配器的。我們來看看,
            單我們的客戶提供的需求并不是一個明確的接口,而是一個類,并沒有定義期望的方法,如下
            Java代碼
            1. public class A{  
            2.    public int add(int a,int b){  
            3.       return a + b;  
            4.    }  
            5. }  

            現在客戶要一個新類B,要求能在保留類A功能的情況下增加一個運算減法的功能,并要求B能隨時替換掉A但不能對已有系統造成影響。這樣我們只能新建一個類B,并讓B繼承A。
            Java代碼
            1. public class B extends A{  
            2.     b(){  
            3.       super();  
            4.     }  
            5.   
            6.     public int minus(int a,int b){  
            7.            //待實現的減法運算函數..  
            8.     }  
            9. }  

            這時候,我們發現類C已經提供了實現減法的函數,
            Java代碼
            1. public class C{  
            2.     public int minus(int a,int b){  
            3.            return a - b;  
            4.     }  
            5. }  

            為了避免重復去設計該函數,我們決定引入C類,通過適配C類來達到我們的期望,但問題是A和C都是一個具體類,我們無法讓B同時繼承這個兩個類,而B繼承A又是必須的,所以我們只能考慮把C給內聚到B內部,對象適配器又得派上用場了。
            Java代碼
            1. public 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. }  

            這樣,在需要A類的地方都能用B類來代替,同時又保證了新的功能的引入。

            更靈活的實現--隱藏目標接口的抽象適配器

            做java 桌面應用的都知道WindowListener接口,
            Java代碼
            1. public interface WindowListener extends EventListener{  
            2.  public void windowActivated(WindowEvent e);  
            3.  public void windowClosed(WindowEvent e);  
            4.  public void windowClosing(WindowEvent e);  
            5.  public void windowDeactivated(WindowEvent e);  
            6.  public void windowDeiconified(WindowEvent e);  
            7.  public void windowIconified(WindowEvent e);  
            8.  public void windowOpened(WindowEvent e);  
            9. }  

            要實現這個接口,我們就必須實現它所定義的所有方法,但是實際上,我們很少需要同時用到所有的方法,我們要的只是其中的兩三個。為了不使我們實現多余的方法,
            jdk WindowListener提供了一個WindowListener的默認實現類WindowAdapter類,這是一個抽象類,
            Java代碼
            1. public abstract class WindowAdapter implements WindowListener{  
            2.  public void windowActivated(WindowEvent e){}  
            3.  public void windowClosed(WindowEvent e){}  
            4.  public void windowClosing(WindowEvent e){}  
            5.  public void windowDeactivated(WindowEvent e){}  
            6.  public void windowDeiconified(WindowEvent e){}  
            7.  public void windowIconified(WindowEvent e){}  
            8.  public void windowOpened(WindowEvent e){}  

            posted on 2009-11-28 16:20 baby-fly 閱讀(283) 評論(0)  編輯 收藏 引用 所屬分類: Design Pattern
            久久丝袜精品中文字幕| 女人香蕉久久**毛片精品| 亚洲精品无码专区久久同性男| 国产亚州精品女人久久久久久| 久久久久久久久66精品片| 国产情侣久久久久aⅴ免费| 一本伊大人香蕉久久网手机| 理论片午午伦夜理片久久 | 久久婷婷五月综合色奶水99啪| 久久精品国产亚洲av日韩| 久久久久久A亚洲欧洲AV冫| 亚洲AV无码久久精品色欲| 99久久精品免费观看国产| 欧美一区二区三区久久综| 久久国产精品免费| 久久久久免费精品国产| 少妇精品久久久一区二区三区| 精品久久久久久99人妻| …久久精品99久久香蕉国产| 狠狠色婷婷久久综合频道日韩| 99热都是精品久久久久久| 久久99国产乱子伦精品免费| 久久人人爽人人爽人人av东京热 | 99热精品久久只有精品| 亚洲色大成网站www久久九| 免费一级做a爰片久久毛片潮| 久久久久国产精品| 97精品国产91久久久久久| 久久久SS麻豆欧美国产日韩| 理论片午午伦夜理片久久| 99久久婷婷国产综合精品草原| 99久久免费国产精精品| 久久久国产乱子伦精品作者| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 麻豆久久| 婷婷久久综合九色综合绿巨人| 精品免费久久久久国产一区| 久久精品亚洲男人的天堂| 九九久久精品国产| 亚洲日韩欧美一区久久久久我| 人人狠狠综合久久亚洲高清|