• <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>

            為生存而奔跑

               :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

            留言簿(5)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            積分與排名

            • 積分 - 328403
            • 排名 - 74

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

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

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

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

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

            對(duì)象適配器
            我們?cè)賮?lái)看看另一種情況:
            假如客戶(hù)接口期望的功能不止一個(gè),而是多個(gè):
            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. }  

            而能提供這些實(shí)現(xiàn)的原可能不止一個(gè):
            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是不能實(shí)現(xiàn)多繼承的,所以我們不能通過(guò)構(gòu)建一個(gè)適配器,讓他來(lái)繼承所有原以完成我們的期望,這時(shí)候怎么辦呢?只能用適配器的另一種實(shí)現(xiàn)--對(duì)象適配器
            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.       //適配加法運(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. }  

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

            現(xiàn)在客戶(hù)要一個(gè)新類(lèi)B,要求能在保留類(lèi)A功能的情況下增加一個(gè)運(yùn)算減法的功能,并要求B能隨時(shí)替換掉A但不能對(duì)已有系統(tǒng)造成影響。這樣我們只能新建一個(gè)類(lèi)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.            //待實(shí)現(xiàn)的減法運(yùn)算函數(shù)..  
            8.     }  
            9. }  

            這時(shí)候,我們發(fā)現(xiàn)類(lèi)C已經(jīng)提供了實(shí)現(xiàn)減法的函數(shù),
            Java代碼
            1. public class C{  
            2.     public int minus(int a,int b){  
            3.            return a - b;  
            4.     }  
            5. }  

            為了避免重復(fù)去設(shè)計(jì)該函數(shù),我們決定引入C類(lèi),通過(guò)適配C類(lèi)來(lái)達(dá)到我們的期望,但問(wèn)題是A和C都是一個(gè)具體類(lèi),我們無(wú)法讓B同時(shí)繼承這個(gè)兩個(gè)類(lèi),而B(niǎo)繼承A又是必須的,所以我們只能考慮把C給內(nèi)聚到B內(nèi)部,對(duì)象適配器又得派上用場(chǎng)了。
            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類(lèi)的地方都能用B類(lèi)來(lái)代替,同時(shí)又保證了新的功能的引入。

            更靈活的實(shí)現(xiàn)--隱藏目標(biāo)接口的抽象適配器

            做java 桌面應(yīng)用的都知道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. }  

            要實(shí)現(xiàn)這個(gè)接口,我們就必須實(shí)現(xiàn)它所定義的所有方法,但是實(shí)際上,我們很少需要同時(shí)用到所有的方法,我們要的只是其中的兩三個(gè)。為了不使我們實(shí)現(xiàn)多余的方法,
            jdk WindowListener提供了一個(gè)WindowListener的默認(rèn)實(shí)現(xiàn)類(lèi)WindowAdapter類(lèi),這是一個(gè)抽象類(lèi),
            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 閱讀(288) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Design Pattern
            久久精品国产亚洲av麻豆蜜芽| 亚洲伊人久久成综合人影院 | 久久久久高潮毛片免费全部播放| 亚洲色大成网站www久久九| 久久久久亚洲av无码专区喷水| 久久91精品国产91久久小草| 久久亚洲欧洲国产综合| 午夜欧美精品久久久久久久| 久久精品一区二区三区不卡| 青青草国产97免久久费观看| 久久国产精品无码HDAV| 久久亚洲精品无码播放| 久久精品这里热有精品| 亚洲精品无码久久久久sm| 香港aa三级久久三级| 奇米综合四色77777久久| 色婷婷狠狠久久综合五月| 精品久久久无码人妻中文字幕豆芽| 老司机午夜网站国内精品久久久久久久久 | 久久综合中文字幕| 亚洲午夜久久久久久久久电影网| 国产999精品久久久久久| 久久精品国产精品亚洲毛片| 亚洲欧美日韩精品久久亚洲区 | 欧美亚洲国产精品久久高清| 国产2021久久精品| 国产欧美一区二区久久| 色欲综合久久中文字幕网| 三级片免费观看久久| 久久精品一区二区三区中文字幕| 精品无码久久久久国产| 久久中文骚妇内射| 欧美日韩精品久久久免费观看| 久久高清一级毛片| 国内精品久久久久久久久 | 午夜精品久久久久久99热| 久久伊人精品一区二区三区| 久久这里有精品| 欧美日韩久久中文字幕| 欧美一区二区久久精品| 中文字幕乱码久久午夜|