適配器模式的官方定義是:適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
舉例說明:很多的插座都是兩孔的,但是你的臺燈的電源線卻有三個腳,這樣你無法直接將臺燈直接使用,要想三腳的電源線插到兩孔的插座上你需要買一個(三腳-兩孔)的轉換器來將它們適配起來,而這個轉換器我們稱之為適配器。
適配器模式分為3類:類的適配器模式、對象的適配器模式、接口的適配器模式。
1.類的適配器模式:
你有一個源類,他有一個method1()方法,如下
public class source{
public void method1(){
System.out.println("this is method1");
}
}
但是你的客戶期望的接口并不是這個源類這樣的,他不僅僅需要有method1方法還需要有method2方法。如下:
public interface targrt{
public void method1();
public void method2();
}
此時,要想滿足目標接口你需要創建一個適配器,它既有source的method1方法還有類interface的method方法,如下:
class adapter extends source implements targrt{
/*
* method1方法可以直接從source繼承過來
* 自己實現接口中的method2方法
*/
@Override
public void method2() {
System.out.println("this is method2");
}
}
但是這樣做是有一個大問題就是當Source類有兩個時,由于Java時單繼承的,無法通過類適配器模式來完成。如:
public class source1{
public void method3(){
System.out.println("this is method3");
}
}
2.對象適配器模式
對象適配器模式跟類適配其模式相比僅僅是改變了Adapter類。如下:
class adapter implements targrt{
private Source source;
private Source1 source1;
public Adapter(Source source,Source1 source1){
this.source = source;
this.source1 = souce1;
}
public void method1(){
this.source.method1();
}
public void method3(){
this.source1.method3();
}
/*
* 自己實現接口中的method2方法
*/
@Override
public void method2() {
System.out.println("this is method2");
}
}
對象適配器模式是將源方法的實現通過持有一個源實例的形式,這樣當有多個source類時可以通過持有多個實例來實現,解決了類適配其模式的問題。
3.缺省適配模式
缺省適配(Default Adapter)模式為一個接口提供缺省實現,這樣子類型可以從這個缺省實現進行擴展,而不必從原有接口進行擴展。
很多時候我們的寫的一個類需要繼承一個目標接口,但是這個目標接口有很多方法我們用不上,我們想只實現其中想要的方法時可以使用缺省適配器模式。首先定義一個抽象類來繼承目標接口,然后用自己的類去繼承這個抽象類的方式實現目標接口。如下:
/*
* 目標接口,其中我們只想要method1方法
*/
public interface Target{
public void method1();
public void method2();
}
public abstract class Adapter implements Target{
public void method1(){}
public void method2(){}
}
我們寫的類(只去實現method1方法):
public class MyClass extends Adapter{
public void method1(){
System.out.println("this is method1");
}
}
最后的Test類:
public class Test {
public static void main(String[] args) {
Target target = new MyClass();
}
}
總結:
類的適配器模式:當希望將一個類轉換成滿足另一個新接口的類時,可以使用類的適配器模式,創建一個新類,繼承原有的類,實現新的接口即可。
對象的適配器模式:當希望將一個對象轉換成滿足另一個新接口的對象時,可以創建一個類,持有原類的一個實例,在類的方法中,調用實例的方法就行。
缺省適配器模式:當不希望實現一個接口中所有的方法時,可以創建一個抽象類,實現所有方法,我們寫別的類的時候,繼承抽象類即可。
適配器模式的缺點:
過多的使用適配器,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是A接口,其實內部被適配成了B接口的實現,一個系統如果太多出現這種情況,無異于一場災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。