Java設計模式03:適配器(Adapter)

一、功能html

適配器模式把一個類的接口變換成客戶端所期待的另外一種接口,從而使本來因接口不匹配而沒法在一塊兒工做的兩個類可以在一塊兒工做。java

二、模式中的角色app

  適配器模式有類的適配器模式對象的適配器模式兩種不一樣的形式,還有就是缺省適配模式ide

三、缺省適配模式this

  缺省適配(Default Adapter)模式爲一個接口提供缺省實現,這樣子類型能夠從這個缺省實現進行擴展,而沒必要從原有接口進行擴展。做爲適配器模式的一個特例,缺省適配模式在JAVA語言中有着特殊的應用。spa

咱們在SE開發中常常使用界面的關閉事件。htm

 public TestWindowListener2()
   {
        setLayout(new FlowLayout(FlowLayout.CENTER));
        add(new JButton("我是一個按鈕"));
       addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)//窗口正處在關閉過程當中時調用
            {
                System.out.println("我關");
                System.exit(0);
             }
         }
        );
     }

WindowListener接口定義了一序列窗口事件。WindowAdapter抽象類實現了接口WindowListener的windowClosing 抽象方法的空實現(默認實現)public void windowClosing(WindowEvent e) {},這樣客戶端只須要繼承適配器類,重寫關注的接口代碼便可!而不須要實現接口定義的每一個方法。在上面案例中windowClosing爲咱們須要關注的方法重寫該方法的實現便可,而不須要強制實現接口定義的其餘方法好比windowOpened事件。對象

類的適配器模式和對象適配器模式能夠參考博文http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html,我的以爲寫的仍是比較清楚的。blog

四、類的適配器模式繼承

類的適配器模式把適配的類的API轉換成爲目標類的API。

在上圖中能夠看出,Adaptee類並無sampleOperation2()方法,而客戶端則期待這個方法。爲使客戶端可以使用Adaptee類,提供一箇中間環節,即類Adapter,把Adaptee的API與Target類的API銜接起來。Adapter與Adaptee是繼承關係,這決定了這個適配器模式是類的:

  模式所涉及的角色有:

  ●  目標(Target)角色:這就是所期待獲得的接口。注意:因爲這裏討論的是類適配器模式,所以目標不能夠是類。

  ●  源(Adapee)角色:如今須要適配的接口。

  ●  適配器(Adaper)角色:適配器類是本模式的核心。適配器把源接口轉換成目標接口。顯然,這一角色不能夠是接口,而必須是具體類。

public interface Target {
    /**
     * 這是源類Adaptee也有的方法
     */
    public void sampleOperation1();
    /**
     * 這是源類Adapteee沒有的方法
     */
    public void sampleOperation2();
}

上面給出的是目標角色的源代碼,這個角色是以一個JAVA接口的形式實現的。能夠看出,這個接口聲明瞭兩個方法:sampleOperation1()和sampleOperation2()。而源角色Adaptee是一個具體類,它有一個sampleOperation1()方法,可是沒有sampleOperation2()方法。

public class Adaptee {
    
    public void sampleOperation1(){}

}

 

適配器角色Adapter擴展了Adaptee,同時又實現了目標(Target)接口。因爲Adaptee沒有提供sampleOperation2()方法,而目標接口又要求這個方法,所以適配器角色Adapter實現了這個方法。

public class Adapter extends Adaptee implements Target {
    /**
     * 因爲源類Adaptee沒有方法sampleOperation2()
     * 所以適配器補充上這個方法
     */
    @Override
    public void sampleOperation2() {
        //寫相關的代碼
    }

}

五、對象適配器模式

與類的適配器模式同樣,對象的適配器模式把被適配的類的API轉換成爲目標類的API,與類的適配器模式不一樣的是,對象的適配器模式不是使用繼承關係鏈接到Adaptee類,而是使用委派關係鏈接到Adaptee類。

從上圖能夠看出,Adaptee類並無sampleOperation2()方法,而客戶端則期待這個方法。爲使客戶端可以使用Adaptee類,須要提供一個包裝(Wrapper)類Adapter。這個包裝類包裝了一個Adaptee的實例,從而此包裝類可以把Adaptee的API與Target類的API銜接起來。Adapter與Adaptee是委派關係,這決定了適配器模式是對象的。

public interface Target {
    /**
     * 這是源類Adaptee也有的方法
     */
    public void sampleOperation1();
    /**
     * 這是源類Adapteee沒有的方法
     */
    public void sampleOperation2();
}

 

public class Adaptee {

    public void sampleOperation1(){}
    
}

 

public class Adapter {     private Adaptee adaptee;          public Adapter(Adaptee adaptee){         this.adaptee = adaptee;     }     /**      * 源類Adaptee有方法sampleOperation1      * 所以適配器類直接委派便可      */     public void sampleOperation1(){         this.adaptee.sampleOperation1();     }     /**      * 源類Adaptee沒有方法sampleOperation2      * 所以由適配器類須要補充此方法      */     public void sampleOperation2(){         //寫相關的代碼     } }
相關文章
相關標籤/搜索