一、引出適配器模式概念
我們要給手機充電,但是我們知道家用電是220v,而我們的手機一般是5v,如果我們直接使用那顯然是不行的。這時候我們就需要一個轉換器,也就是我們的充電器。它在內部把220v轉換成5v。
我們的適配器也是同理,當我們需要使用某個類但是不能直接使用,這個時候就需要適配器來進行一下轉換。
二、適配器
一個適配器包含了三種角色:
- 資源對象(src)
- 適配器(adapter)
- 目標接口(dist)
2-1:類適配器
2-1-1:src 資源對象
// 220v 電壓提供者
public class Src220V {
public int outPut220V(){
int src = 220;
return src;
}
}
2-1-2:dist接口
// 提供一個5v的接口
public interface Dist5V {
int outPut5v();
}
2-1-3:adapter 適配器
public class adapter extends Src220V implements Dist5V {
@Override
public int outPut5v() {
int i = outPut220V();
// ---- 具體的轉換業務
// ---
return i / 44;
}
}
2-1-4:測試
public class Main {
public static void main(String[] args) {
new adapter().outPut5v();
}
}
類適配器: 適配器繼承資源對象,然後實現目錄接口重寫裏面的方法。
總結
- 優點:直接繼承了src類,可以重寫裏面的方法,試得Adapter更加的靈活。
- 缺點:因爲Java裏面是單繼承的,這次繼承之後,我們後面就無法再繼承了,並且繼承src那麼dist就必須是接口。
2-2:對象適配器
類適配器,使用繼承存在問題。對象適配器使用組合的方式解決單繼承的問題。
2-2-1:src 資源對象 (不需要改變)
// 220v 電壓提供者
public class Src220V {
public int outPut220V(){
int src = 220;
return src;
}
}
2-2-2:dist接口 (不需要改變)
// 提供一個5v的接口
public interface Dist5V {
int outPut5v();
}
2-2-3:adapter 適配器
public class adapter implements Dist5V {
private Src220V src220V;
public adapter(Src220V src220V){
this.src220V = src220V;
}
@Override
public int outPut5v() {
int i = 0;
if (src220V != null){
i = src220V.outPut220V();
// ---- 具體的轉換業務
// ---
i = i / 44;
}
return i;
}
}
2-2-4:測試
public class Main {
public static void main(String[] args) {
new adapter(new Src220V()).outPut5v();
}
}
總結
- 優點:根據合成複用原則,使用組合代替了繼承。解決了繼承問題和dist必須是接口的問題。
- 缺點:我們實現了 dist 接口,就必須實現裏面全部的方法,有些方法我們不需要也必須實現。
2-3:接口適配器
在JDK8之前,我們的解決辦法是讓一個抽象類實現接口裏面的方法(空實現),然後我們繼承抽象類就可以選擇性的覆蓋裏面的方法了。
在JDK8之後,我們的接口支持默認實現了,這樣的話,我們就不需要一箇中間抽象類了。
2-3-1:我們修改 dist 接口
public interface Dist5V {
default int outPut5v(){
return 5;
}
default int outPut8v(){
return 8;
}
default int outPut10v(){
return 10;
}
}