一 定義
適配器模式在我們的開發(fā)過程中使用率非常高花竞,從android開發(fā)中隨處可見的Adapter就可以看出。那么什么是適配器模式呢倘核,適配器是將兩個不兼容的類融合在一起谷浅,將不同的東西通過一種轉(zhuǎn)換使得他們協(xié)作起來好爬。
適配器模式把一個類的接口變換成客戶端所期待的另一個接口局雄,從而使原本因接口不匹配而無法再一起工作的兩個類能夠在一起工作。
簡單地說存炮,適配器就是一種適配中間件炬搭,它存在于不匹配的了兩者之間蜈漓,用于連接兩者,使不匹配變得匹配尚蝌。
二 使用場景
- 系統(tǒng)需要使用現(xiàn)有的類迎变,而此類的接口不符合系統(tǒng)的需要充尉,既接口不兼容飘言。
- 想要建立一個可以重復(fù)使用的類,用于一些彼此之間沒有太大關(guān)聯(lián)的一些類驼侠,包括一些可能在將來引進姿鸿。
- 需要一個統(tǒng)一的輸出接口,而輸入端的類型不可預(yù)知倒源。
三 類適配器
適配器模式分為兩種苛预,既類適配器模式和對象適配器模式。首先看類是適配器模式笋熬。
三-1 模式結(jié)構(gòu)
如圖所示热某,類適配器是通過實現(xiàn)Target接口以及繼承Adaptee類實現(xiàn)接口轉(zhuǎn)換的,例如胳螟,目標接口Target需要的是operation2昔馋,但是Adaptee里只有一個operation3,因此就出現(xiàn)了不兼容的情況糖耸,因此可以通過Adapter實現(xiàn)一個operation2方法將Adaptee的operation3轉(zhuǎn)化為Target需要的operation2秘遏,實現(xiàn)兼容。
- Target:目標角色嘉竟,該角色定義把其他類型轉(zhuǎn)化為何種接口邦危,也就是我們期望的接口。
- Adaptee:需要適配的接口舍扰,源角色倦蚪。
- Adapter:適配器角色,將源角色轉(zhuǎn)換為目標角色边苹,也是本模式的核心陵且。這一角色不可以是接口,而必須是實體類勾给。
三-2 實例
下面以生活中常見的給手機充電的例子來說明滩报,生活中的電線電壓一般都是220v,而手機充電需要的電壓是5v的播急,這就出現(xiàn)了不匹配的情況脓钾,這時就需要一個中間層,即適配器來解決桩警。
通過以上分析可知可训,5v的電壓就是Target接口,220V電壓就是Adaptee類,而將電壓從220V轉(zhuǎn)換為5V就是Adapter握截。
具體的代碼如下:
- Target角色飞崖,目標角色,是一個接口或者抽象類
// Target角色
public interface FiveVolt {
public int getVole5();
}
- Adaptee角色
// Adaptee角色谨胞,需要被轉(zhuǎn)換的對象
public class Volt220 {
public int getVolt220(){
return 220;
}
}
- Adapter 角色
// Adapter角色固歪,將220V的電壓
public class VoltAdapter extends Volt220 implements FiveVolt{
@Override
public int getVole5() {
return 5;
}
}
- 測試代碼
VoltAdapter adapter=new VoltAdapter();
System.out.println("輸出電壓: "+adapter.getVole5());
以上,因為對應(yīng)的Target的目標是要獲取5v的輸出電壓胯努,而Adatee正常輸出電壓是220V牢裳,此時就需要Adapter將220v的電壓轉(zhuǎn)換為5v電壓,解決了接口不兼容問題叶沛。
四 對象適配器
與類適配器不同的是蒲讯,對象適配器在將適配的類的API轉(zhuǎn)換為目標類的API時,不是使用繼承的關(guān)系灰署,而是使用代理的方式判帮。
也就是說,需要提供一個包裝類Adapter溉箕,這個包裝類包裝了一個Adaptee的實例晦墙,從而此包裝類能夠把Adaptee的API與Target類的API鏈接起來。
代碼如下
- Target角色约巷,目標角色
// Target角色
public interface FiveVolt {
public int getVole5();
}
- Adaptee角色
// Adaptee角色偎痛,需要被轉(zhuǎn)換的對象
public class Volt220 {
public int getVolt220(){
return 220;
}
}
- Adapter 角色
// 對象適配器模式
public class VoltsAdapter implements FiveVolt{
Volt220 mVolt220;
public VoltsAdapter(Volt220 adaptee){
mVolt220=adaptee;
}
public int getVolt220(){
return mVolt220.getVolt220();
}
@Override
public int getVole5() {
return 5;
}
}
- 測試代碼
VoltsAdapter adapter1=new VoltsAdapter(new Volt220());
System.out.println("輸出電壓: "+adapter1.getVole5());
適配器模式的本質(zhì)就是:轉(zhuǎn)換匹配,復(fù)用功能独郎。適配器模式具有以下優(yōu)點:
- 更好的復(fù)用性
如果功能已經(jīng)有了踩麦,只是接口不兼容,那么可以通過是適配器模式讓這些功能得到很好的復(fù)用氓癌。 - 更好的擴展性
使用適配器模式可以自然地擴展系統(tǒng)的功能谓谦。 - 但是,不宜過多地使用適配器贪婉,會讓系統(tǒng)非常凌亂反粥,不易于對對項目的整體把握。