適配器模式的介紹:適配器模式在開發中使用率很高,適配器是將兩個不兼容的類融合在一起,它有點像粘合劑,將不同的東西通過一種轉換使得它們能夠協作起來。例如經常碰到兩個不相關的類之間進行交互,第一個解決方案是修改各自類的接口,但是如果沒有源碼或者我們不愿意為了一個應用而修改各自的接口,此時怎么辦?這種情況我們往往會使用一個Adapter,在這兩種接口之間創建一個“混血兒”接口,這個Adapter會將這兩個接口兼容,在不修改源碼的情況下滿足需求。
適配器模式的定義:適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能在一起工作
適配器使用場景:
1 系統需要使用現有的類,而此類的接口不符合系統的需要,即接口不兼容
2 想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作
3 需要一個統一的輸出接口,而輸入端的類型不可預知
?
用電源接口做例子,筆記本電腦的電源一般都是5V電壓,但是我們生活中的電線電壓一般都是220V,這個時候就出現了不匹配的情況,不軟件開發中我們稱之為接口不兼容,此時就需要適配器來進行一個接口轉換,在軟件開發中有一句話正好體現了這點:任何問題都可以加一個中間層來解決。這個層我們可以理解為這里的Adapter層,通過這層來進行一個接口轉換就達到了兼容的目的。
適配器模式分分兩種:
1)類適配器模式
2) 對象適配器模式
先說第一種類適配器模式:
?
5V電壓的接口,代碼如下:
1 /** 2 * Target角色,就是要轉換成的5V的 3 */ 4 public interface FiveVolt { 5 int getVolt5(); 6 }
?
220V的電壓,需要被轉換的
1 /** 2 * 220V的電壓,被轉換的類 3 */ 4 public class Volt220 { 5 public int getVolt220(){ 6 return 220; 7 } 8 }
?
下面是Adapter角色,將220V的電壓轉換成5V的電壓
1 /** 2 * 適配器,即有5V的,又有220V的,就像轉換頭一樣,兩邊都可以兼容 3 */ 4 public class ClassVoltAdapter extends Volt220 implements FiveVolt { 5 @Override 6 public int getVolt5() { 7 return 5; 8 } 9 }
看到沒,上面的ClassVoltAdapter里面即有220V的,又有5V的,需要5V的也可以用,需要220V的也可以用。
下面是類適配器模式的測試類:
1 /** 2 * 下面是類適配器模式的測試類 3 */ 4 public class ClassAdapterTest { 5 public static void main(String[] args){ 6 test(); 7 } 8 9 public static void test(){ 10 11 ClassVoltAdapter voltAdapter = new ClassVoltAdapter(); 12 System.out.println(voltAdapter.getVolt5()); 13 14 } 15 16 }
?
?
下面再來看看第二種適配器模式:對象適配器模式
首先前面的 5V的接口和220V的類還是一樣的。這里只是把代碼貼出來供方便查看的。
5V電壓的接口,代碼如下:
1 /** 2 * Target角色,就是要轉換成的5V的 3 */ 4 public interface FiveVolt { 5 int getVolt5(); 6 }
?
220V的電壓類
/*** 220V的電壓,被轉換的類*/ public class Volt220 {public int getVolt220(){return 220;} }
?
下面看一下對象適配器類:主要是實現了目標接口,并且保存了一個被轉換的類的對象的引用 ,代碼如下:
1 /** 2 * 對象適配器,實現目標接口,保存一個被轉換對象的引用 3 */ 4 public class ObjectVoltAdapter implements FiveVolt{ 5 //保存一個被轉換對象的引用 6 Volt220 volt220; 7 8 public ObjectVoltAdapter(Volt220 volt220){ 9 this.volt220 = volt220; 10 } 11 12 @Override 13 public int getVolt5() { 14 return 5; 15 } 16 17 public int getVolt220(){ 18 return volt220.getVolt220(); 19 } 20 }
?
下面是對象適配器模式測試類:
1 /** 2 * 對象適配器的測試類 3 */ 4 public class ObjectVoltAdapterTest { 5 public static void main(String[] args){ 6 test(); 7 } 8 9 public static void test(){ 10 //創建一個220V的電壓類的對象,也就是被轉換的類的對象 11 Volt220 volt220 = new Volt220(); 12 //創建一個對象適配器類的對象,并且保存一個被轉換的類的對象 13 ObjectVoltAdapter voltAdapter = new ObjectVoltAdapter(volt220); 14 System.out.println(voltAdapter.getVolt5()); 15 } 16 }
?