適配器模式
定義: 把一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個(gè)類能夠在一起工作.
使用場(chǎng)景:
- 系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要,即接口不兼容.
- 想要建立一個(gè)可以重復(fù)使用的類,用于與彼此之間沒有太大關(guān)聯(lián)的一些類,包括一些可能在將來引進(jìn)的類一起工作.
- 需要一個(gè)統(tǒng)一的輸出接口,而輸入端的類型不可預(yù)知.
優(yōu)點(diǎn):
- 更好的復(fù)用性,系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要,那么通過適配器模式就可以讓這些功能得到更好的復(fù)用.
- 更好的擴(kuò)展,在實(shí)現(xiàn)適配器功能的時(shí)候,可以調(diào)用自己開發(fā)的功能,從而自然地?cái)U(kuò)展系統(tǒng)的功能.
缺點(diǎn):
過多地使用適配器,會(huì)讓系統(tǒng)非常零亂,不易整體把握.
適配器模式分為兩種,類適配器模式和對(duì)象適配器模式
例子: 假如我們的筆記本電腦需要充電,用的是 5V 的電壓,但是我們正常的電壓是 220V .所以現(xiàn)在出現(xiàn)了不兼容,這就需要一個(gè) adapter 層,來把 220V 的電壓 轉(zhuǎn)換為 5V 的.
- 類適配器模式:
具體實(shí)現(xiàn):
//Target 角色
public interface FiveVolt {
public int getVolt5();
}
//需要被轉(zhuǎn)換的對(duì)象
public class Volt220 {
public int getVolt220(){
return 220;
}
}
//adapter 將220V 電壓轉(zhuǎn)換為 5V 電壓
public class VoltAdapter extends Volt220 implements FiveVolt{
@Override
public int getVolt5() {
//實(shí)際上這個(gè)位置需要把拿到的220V經(jīng)過一系列轉(zhuǎn)化,轉(zhuǎn)換成 5V
return 5;
}
}
客戶端使用:
public static void main(String[] args) {
VoltAdapter voltAdapter = new VoltAdapter();
System.out.println("輸出電壓 : "+ voltAdapter.getVolt5());
}
- 對(duì)象適配器模式
與類的適配器模式一樣,對(duì)象的適配器模式把被適配的類的 API 轉(zhuǎn)換成目標(biāo)類的 API ,與類的適配器模式不同的是,對(duì)象的適配器模式不是使用繼承關(guān)系連接到 Adaptee 類,而是使用代理關(guān)系連接到 Adaptee 類.
//Target 角色
public interface FiveVolt {
public int getVolt5();
}
//需要被轉(zhuǎn)換的對(duì)象
public class Volt220 {
public int getVolt220(){
return 220;
}
}
//區(qū)別
public class VoltAdapter2 implements FiveVolt{
Volt220 volt220;
public VoltAdapter2(Volt220 volt220) {
this.volt220 = volt220;
}
public int getVolt220(){
return volt220.getVolt220();
}
@Override
public int getVolt5() {
return 5;
}
}
這種方式的好處是 被適配對(duì)象中的方法不會(huì)暴露出來,而類適配器由于繼承了被適配對(duì)象,因此,被適配對(duì)象類的函數(shù)在 Adapter 類中也都含有,這樣使得 Adapter 類出現(xiàn)一些奇怪的接口,用戶使用成本較高,所以,對(duì)象適配器模式更加靈活,實(shí)用.
我們?cè)陂_發(fā)中,肯定也經(jīng)常接觸,ListView ,RecyclerView,都會(huì)用到 Adapter ,這個(gè) Adapter 的作用就是把各式各樣的list的數(shù)據(jù),轉(zhuǎn)化為你想要的View 的形式.