1、使用場景
適配器模式把一個類的接口變換成客戶端所期待的另一種接口。以消除由於接口的不匹配所造成類的兼容性問題。適配器模式主要有類的適配器模式、對象的適配器模式兩種。
2、兩種適配器模式介紹
模式所涉及的角色有:
目標(Target)角色:這就是所期待得到的接口。
源(Adapee)角色:現在需要適配的接口。
適配器(Adaper)角色:適配器類是本模式的核心。適配器把源接口轉換成目標接口。(充當中間角色)
1)類的適配器模式
類的適配器模式把適配的類(即源類)的API轉換成爲目標類的API。
由於是類適配器模式,因此目標不可以是類,適配器不可以是接口而必須是類。
public interface Target { /** * 這是源類Source也有的方法 */ public void sampleOperation1(); /** * 這是源類Source沒有的方法 */ public void sampleOperation2(); } |
上面是目標角色的源代碼,這個接口聲明瞭兩個方法:sampleOperation1()和sampleOperation2()。而源角色Source是一個具體類,它有一個sampleOperation1()方法,但是沒有sampleOperation2()方法。
public class Source{ public void sampleOperation1(){}
}
|
適配器角色Adapter擴展了Source,同時又實現了目標(Target)接口。由於Source沒有提供sampleOperation2()方法,而目標接口又要求這個方法,因此適配器角色Adapter實現了這個方法。
public class Adapter extends Source implements Target { /** * 由於源類Source 沒有方法sampleOperation2() * 因此適配器補充上這個方法 */ @Override public void sampleOperation2() { //寫相關的代碼 } } |
2)對象的適配器模式
與類的適配器模式一樣,對象的適配器模式把被適配的類的API轉換成爲目標類的API,但對象的適配器模式不是使用繼承關係連接到Source類,而是使用委派關係連接到Source類。
public class Adapter implements Target{ private Source source;
public Adapter(Source source){ this.source = source; } /** * 源類Source有方法sampleOperation1 * 因此適配器類直接委派即可 */ public void sampleOperation1(){ this.source.sampleOperation1(); } /** * 源類Source沒有方法sampleOperation2 * 因此由適配器類需要補充此方法 */ public void sampleOperation2(){ //寫相關的代碼 } } |
爲使客戶端能夠使用Source類,需要提供一個包裝(Wrapper)類Adapter。這個包裝類包裝了一個Source的實例,從而此包裝類能夠把Source的API與Target類的API銜接起來。Adapter與Source是委派關係,這決定了適配器模式是對象的。