適配器模式把一個類的接口變成客戶端所期待的另外一個接口,從而使本來不匹配而沒法在一塊兒工做的兩個類可以在一塊兒工做java
適配器模式分爲兩種,類適配器模式和對象適配器模式markdown
classDiagram Target <|.. Adapter Adaptee <|-- Adapter class Target{ <<interface>> +operation1() +operation2() } class Adapter{ +operation2() } class Adaptee{ +operation3() }
//Target 角色,須要5V電壓
public interface FiveVolt{
int getVolt5();
}
//adaptee 角色,提供220V 電壓
public class Vlot220{
pulic int getVlot220(){
return 220;
}
}
//adapter 角色,將220V 電壓轉換成5V 電壓
public class VlotAdapter extends Vlot220 implements FiveVolt{
public int getVolt5(){
return 220to5Vlot();
}
private int 220to5Vlot(){
return 5;
}
}
//使用
public class Test{
public static void main(String[] args){
VlotAdapter adapter = new VlotAdapter();
adapter.getVolt5();
}
}
複製代碼
classDiagram Target <|.. Adapter Adaptee <.. Adapter class Target{ <<interface>> +operation1() +operation2() } class Adapter{ +operation2() } class Adaptee{ +operation3() }
從類圖上能夠看出,對類適配器和象適配器的不一樣主要是在Adapter 和 Adaptee 的關係上;前者是繼承,後者是組合。spa
//adapter 角色
public class VoltAdapter implements FiveVolt{
Volt220 mVolt220;
public VoltAdapter(Volt220 adaptee){
mVolt220 = adaptee;
}
public int getVolt5(){
return 220to5Vlot();
}
private int 220to5Vlot(){
return 5;
}
}
//使用
public class Test{
public static void main(String[] args){
VlotAdapter adapter = new VlotAdapter(new Volt220());
adapter.getVolt5();
}
}
複製代碼
這種實現方式直接將要被適配的對象牀底到Adapter 中,使用組合的形式實現接口兼容的效果。這筆類適配器方式更靈活,它的另外一個好處是被適配對象中的方法不會被暴露出去,類適配器模式因爲繼承了被適配對象,所以被適配對象的方法在Adapter 類中也會有,這使得Adapter 類會多出一些奇怪的方法,用戶使用成本較高。所以,對象適配器更爲靈活、實用。code