-
UML類圖
適配器UML類圖
-
引入
適配器模式主要作用是在新接口和老接口之間進行適配。它非常像我們出國旅行時帶的電源轉換器。比如德國,使用的是德國標準,是兩項圓頭的插頭。如果去德國旅游,那么我們使用的手機充電器插頭無法插到德國的插排中去,那就意味著我們無法給手機充電。怎樣解決這個問題呢?只要使用一個電源轉化器就行了。
-
使用場景
用電源接口做例子,筆記本電腦的電源一般都是接受5V的電壓,但是我們生活中的電線電壓一般都是220V的輸出。這個時候就出現了不匹配的狀況,在軟件開發中我們稱之為接口不兼容,此時就需要適配器來進行一個接口轉換。在軟件開發中有一句話正好體現了這點:任何問題都可以加一個中間層來解決。這個層我們可以理解為這里的Adapter層,通過這層來進行一個接口轉換就達到了兼容的目的。
-
代碼舉例實現
DBSocketInterface.java
package com.design.adapter;
public interface DBSocketInterface {
//使用兩項圓頭的插口供電
void powerWithTwoRound();
}
DBSocketInterfaceImpl.java
package com.design.adapter;
public class DBSocketInterfaceImpl implements DBSocketInterface{
@Override
public void powerWithTwoRound() {
System.out.println("使用兩項圓頭的插孔供電");
}
}
GBSocketInterface.java
package com.design.adapter;
//國標接口
public interface GBSocketInterface {
void powerWithThreeFlat();
}
GBSocketInterfaceImpl.java
package com.design.adapter;
public class GBSocketInterfaceImpl implements GBSocketInterface{
public void powerWithThreeFlat() {
System.out.println("使用三項扁頭插孔供電");
}
}
SocketAdapter.java
這就是我們的重要的適配器類
package com.design.adapter;
public class SocketAdapter implements DBSocketInterface{
//組合新接口
private GBSocketInterface gbSocket;
public SocketAdapter(GBSocketInterface gbSocket) {
this.gbSocket = gbSocket;
}
@Override
public void powerWithTwoRound() {
gbSocket.powerWithThreeFlat();
}
}
DBHotel.java
package com.design.adapter;
public class DBHotel {
private DBSocketInterface dbSocket;
public DBHotel(DBSocketInterface dbSocket) {
this.dbSocket = dbSocket;
}
public void charge(){
//使用德標插口充電
dbSocket.powerWithTwoRound();
}
}
App.java
package com.design.adapter;
public class App {
public static void main(String[] args) {
//我去德國旅游,帶去的充電器是國標的
GBSocketInterface gbSocket = new GBSocketInterfaceImpl();
//由于沒法充電,我拿出隨身帶去的適配器,并且將我帶來的充電器插在適配器的上端插孔中。這個上端插孔是符合國標的,我的充電器完全可以插進去。
SocketAdapter socketAdapter = new SocketAdapter(gbSocket);
//找到一家德國賓館住下,并且插上適配器
DBHotel hotel = new DBHotel(socketAdapter);
//可以充電了
hotel.charge();
}
}
-
總結
優點
更好的復用性
系統需要使用現有的類,而此類的接口不符合系統的需要。那么通過適配器模式就可以讓這些功能得到更好的復用。更好的擴展性
在實現適配器功能的時候,可以調用自己開發的功能,從而自然地擴展系統的功能。
缺點
過多的使用適配器,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是A接口,其實內部被適配成了B接口的實現,一個系統如果太多出現這種情況,無異于一場災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。