巧妙的運用適配器模式,讓你的工作量至少能減輕一半!
大家好,我是了不起,今天我們就一起來聊聊使用超廣的適配器模式!
一、摘要
適配器設計模式是一種結構型模式
適配器模式,顧名思義,就是將一個類的接口轉換成客戶希望的另一個接口,使接口不兼容的類可以一起工作,也被稱為包裝器模式(Wrapper)。
在適配器模式中,通常通過增加一個新的適配器類來解決接口不兼容的問題,使得原本沒有任何關系的類可以協(xié)同工作。
從設計的角度看,適配器模式涉及到三個角色:
- 適配器類:適配器類可以調用另一個接口,從而實現(xiàn)接口的轉換;
- 被適配類:被適配類定義了一個已經存在的接口,這個接口需要適配;
- 客戶角色:客戶類提出使用具體類的請求;
二、方案實踐
在 java 中,適配器模式有兩種,類適配器和對象適配器,下面我們一起來看看!
2.1、類適配模式
首先,我們創(chuàng)建一個接口Phone,接口的實現(xiàn)類為HuaweiPhone!
public interface Phone {
void productPhone();
}
public class HuaweiPhone implements Phone {
@Override
public void productPhone() {
System.out.println("生產一部華為手機");
}
}
在創(chuàng)建另一個接口Player,如果Player的實現(xiàn)類想調用HuaweiPhone中的productPhone方法,該怎么辦呢?
最簡單的方法,就是將productPhone的方式邏輯抄一遍,但是這種方法顯然不高效!
可以通過創(chuàng)建一個適配器ExpensiveAdapter,使之繼承HuaweiPhone,來解決接口轉換的問題,如下:
public class ExpensiveAdapter extends HuaweiPhone implements Player {
@Override
public void action() {
//調用HuaweiPhone中的productPhone方法
productPhone();
System.out.println("用手機播放音樂");
}
}
測試類如下:
public class AdapterClient {
public static void main(String[] args) {
ExpensiveAdapter adapter = new ExpensiveAdapter();
adapter.action();
}
}
即可實現(xiàn)接口的轉換!
但是這種方法,也有很大的局限性,加入Phone接口的實現(xiàn)類有多個呢?
我們知道,類是無法多繼承的,對象適配模式就派上用場了!
2.2、對象適配模式
同樣的,我們可以對ExpensiveAdapter類進行一定的優(yōu)化,如下:
public class ExpensiveAdapter implements Player {
private Phone phone;
public ExpensiveAdapter(Phone phone) {
this.phone = phone;
}
@Override
public void action() {
//調用Phone接口中的productPhone方法
phone.productPhone();
System.out.println("用手機播放音樂");
}
}
測試客戶端如下:
public class PlayerClient {
public static void main(String[] args) {
//對象適配
ExpensiveAdapter adapter = new ExpensiveAdapter(new HuaweiPhone());
adapter.action();
}
}
相比類適配模式,有木有發(fā)現(xiàn)對象適配模式更加靈活~
三、應用
在 jdk 中,適配器設計模式應用也非常廣泛,例如我們熟悉的io包,其中字節(jié)流轉字符流,就使用到了適配器模式!
圖片
圖片
其中,最廣泛的莫過于Spring中的ioc對象依賴關系,在類A中,通過引入另一個類B 對象,就可以調用類 B 中的方法了,從而實現(xiàn)方法的協(xié)同工作!
四、總結
適配器模式,可以讓任何兩個沒有關聯(lián)的類一起運行,提高了類的復用;但是,過多地使用適配器,會讓系統(tǒng)非常零亂,不易整體進行把握。比如,明明看到調用的是另一個接口,反而另一個接口又回調了自身,一個系統(tǒng)如果太多出現(xiàn)這種情況,無異于一場災難。
同時,由于 JAVA 至多繼承一個類,所以至多只能適配一個適配者類,在設計的時候盡可能的選擇對象適配模式!
五、參考
1、https://www.runoob.com/design-pattern/adapter-pattern.html
2、https://www.jianshu.com/p/b3a00cca10de