1.定義:
把一個類的接口轉(zhuǎn)換成客戶端所期待的另一種接口,從而使原本因為接口不匹配而無法一起工作的兩個類能在一起工作。
充當粘合劑的效果
適配器模式.png
例子:
手機充電器,普通家用電壓是220v,而手機的充電電壓一般為5v,如果直接用家用電充手機肯定不行,就需要一個充電器適配器,
將普通電壓轉(zhuǎn)為手機能用的電壓。
2.分類
類適配器模式(不推薦使用):
由于類適配器模式需要多重繼承對一個接口對另一個接口進行適配,而C#,Java不支持多重繼承。對象適配器模式:
采用組合的方式
3.類適配器模式
類適配器角色:
- 需要被適配的類:各個球員
- 適配器接口:翻譯的一個接口
- 具體的適配器的實現(xiàn):相當于各國的翻譯
這里拿一下為示例:
NBA中的球員來自不同國家,而世界標準語言是英語。那他們不會英語,也不能各自學(xué)習所有國家的語言。所以,最好的辦法就是請不同的翻譯將這些球員國家的語言翻譯成英語。
類適配器代碼
適配的類
/**
* 需要被適配的類(各個球員)
*/
public class Adaptee {
public void request(){
System.out.println("請求通過");
}
}
適配器接口
/**
* 適配器接口:翻譯的一個接口
*/
public interface Target {
void handleReq();
}
具體的適配器的實現(xiàn)
/**
* 具體的適配器的實現(xiàn)(相當于各國的翻譯)
*/
public class Adapter extends Adaptee implements Target{
//這里需要和被適配對象關(guān)聯(lián)起來:1.繼承 2.組合(推薦)
private Adaptee adaptee;
@Override
public void handleReq() {
super.request();
}
}
客戶端
/**
* 測試對象適配器模式
*/
public class Client {
//說話
public void test1(Target t){
t.handleReq();
}
public static void main(String[] args) {
Client c = new Client();
Adaptee a = new Adaptee();
Target t = new Adapter();
c.test1(t);
}
}
4.對象適配器
由于類適配器中只能繼承一個被需要適配的對象,則不推薦使用。
要使用對象適配器,只需要使用組合即可。修改適配器實現(xiàn)代碼
/**
* 需要被適配的類(各個球員)
*/
public class Adaptee {
public void request(){
System.out.println("請求通過");
}
}
/**
* 適配器接口:翻譯的一個接口
*/
public interface Target {
void handleReq();
}
/**
* 具體的適配器的實現(xiàn)(相當于各國的翻譯)
*/
public class Adapter implements Target{
//這里需要和被適配對象關(guān)聯(lián)起來:1.繼承 2.組合(推薦)
private Adaptee adaptee;//這里使用組合
@Override
public void handleReq() {
adaptee.request();
}
public Adapter(Adaptee adaptee) {//在構(gòu)造器中構(gòu)造被適配的對象
super();
this.adaptee = adaptee;
}
}
/**
* 測試對象適配器模式
*/
public class Client {
//說話
public void test1(Target t){
t.handleReq();
}
public static void main(String[] args) {
Client c = new Client();
Adaptee a = new Adaptee();
Target t = new Adapter(a);//需要傳入適配器
c.test1(t);
}
}
android中常用的BaseAdapter
RecyclerView