一、定義:
適配器模式是把一個類的接口變化成客戶端所期待的另一種接口,從而使原本因接口不匹配的而無法在一起工作的兩個類能夠在一起進行工作
二、使用場景:
1.系統想用現有的類,而此類的接口不符合所期待的系統的需要,即不兼容
2.想建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類
3.需要統一輸出的接口,但是輸入類型不可預知情況
三、適配器模式分類:
####3.1類適配器
Adapter 繼承自Adaptee,從而實現適配和轉化
Target : 目標角色,也就是所期待得到的接口
Adapter:適配角色,將不兼容的方法,適配目標角色需要的接口或者方法
Adaptee: 需要適配和轉換的角色
簡單示例
日常生活中電壓爲220V,但是手機充電電壓爲5V,這時候,就需要一個手機電源適配器,將220V的電壓轉爲手機能用的5V電壓,如下所示:
/**
* des:adaptee角色,需要被裝換的對象
* author:onexzgj
* time:2019/5/27
*/
public class Volt220 {
public int getVolt220(){
return 220;
}
}
/**
* Target對象,5V
*/
public interface FiveVolt {
int getVolt5();
}
/**
* des:Adapter對象
* author:onexzgj
* time:2019/5/27
*/
public class VoltAdapter extends Volt220 implements FiveVolt{
@Override
public int getVolt5() {
return getVolt220()/44;
}
}
public class Test {
public static void main(String[] args){
VoltAdapter adapter=new VoltAdapter();
System.out.println("轉化後的電壓爲 : " + adapter.getVolt5());
//轉化後的電壓爲 : 5
}
}
3.2對象適配器
Adapter依賴Adaptee對象,即持有Adaptee的對象,從而實現適配和轉化
Target : 目標角色,也就是所期待得到的接口
Adapter:適配角色,將不兼容的方法,適配目標角色需要的接口或者方法
Adaptee: 需要適配和轉換的角色
簡單示例
/**
* Target對象,5V
*/
public interface FiveVolt {
int getVolt5();
}
/**
* des:adaptee角色,需要被裝換的對象
* author:onexzgj
* time:2019/5/27
*/
public class Volt220 {
public int getVolt220(){
return 220;
}
}
/**
* des:適配器
* author:onexzgj
* time:2019/5/27
*/
public class VoltAdapter implements FiveVolt{
private Volt220 mVolt220;
public VoltAdapter(Volt220 volt220){
this.mVolt220=volt220;
}
@Override
public int getVolt5() {
if (mVolt220!=null)
return mVolt220.getVolt220()/44;
return 220;
}
}
public class Test {
public static void main(String[] args){
int volt5 = new VoltAdapter(new Volt220()).getVolt5();
System.out.println(volt5);
}
}
Target : 目標角色,也就是所期待得到的接口
Adapter:適配角色,將不兼容的方法,適配目標角色需要的接口或者方法
Adaptee: 需要適配和轉換的角色
四、兩種適配的比較
對象適配器是將要適配的對象直接傳遞到Adapter中,使用組合的方式實現接口的兼容,比類適配器靈活,另外一個好處是被適配對象中的方法不會暴露出來,用戶學習成本較低,而類適配器繼承被適配對象,則會暴露出被適配對象的方法。
五、適配器設計模式優點
更好的複用性,將現有類,通過適配器設計模式就可以讓現有類功能更好的複用。
更好的擴展性,在原有類的基礎上,增加了自己適配的方法,從而擴展了系統功能。