概述
對於適配器相信大家不會陌生,生活中有各種各樣的例子,像耳機轉接線,充電器適配器,水管適配接口等等。通過類比我們很容易理解適配器的作用:
將已有的本無法使用的類通過適配器轉換,從而達到資源複用,節省開銷的目的。
那要如何通過代碼實現這一點呢?既然要將被適配者轉換爲目標接口類,那麼適配器肯定是要實現自該接口的,以保證類型、行爲的一致,但要如何轉換呢?很簡單,只需要通過繼承或組合被適配者就能輕易的實現。注意基於多使用組合,少使用繼承的原則,我們一般會選擇組合的方式來實現,這種方式叫對象適配器,而通過繼承實現的叫類適配器,後者一般用於一個適配器需要轉換多個被適配者的情況;但Java中沒有多繼承,因此此處僅討論對象適配器。類圖如下:
Coding
小明有一臺用腎換來的IPhone,某天IPhone的充電器壞了,但IPhone的充電器太貴,小明沒錢買新的了,他想到之前的Android充電器還是好的,但是不兼容IPhone手機啊,不過小明知道網上有Android和IPhone的接口轉換器賣,而且很便宜,立馬就買了一個回來,完美解決,不用再賣腎了。我們就用代碼來實現這個過程,首先是IPhone和Android:
···java
public class IPhone {
// 注意IPhone充電器現在是不能正常工作的
public void iPhoneCharging() {
System.out.println("充電器壞了。。。");
}
}
public class Andriod {
public void andriodCharging() {
System.out.println("充電中....");
}
}
···
可以看到這兩個東西完全沒有關聯,但小明需要Android充電器和IPhone充電器一樣爲IPhone充電:
public class AndriodAdatper extends IPhone {
private Andriod andriod;
public AndriodAdatper(Andriod andriod) {
this.andriod = andriod;
}
@Override
public void iPhoneCharging() {
andriod.andriodCharging();
}
}
有了這個適配器小明就可以正常充電了:
public class XiaoMing {
public static void main(String[] args) {
Andriod andriod = new Andriod();
IPhone iPhone = new AndriodAdatper(andriod);
iPhone.iPhoneCharging();
}
}
實現適配器非常容易,通過上述代碼,我們也可以看到被適配者對於客戶端而言是完全透明的,具體需要適配什麼也是由客戶端來決定的,通過適配器就將現有的接口類和被適配者完全解耦了,但是我們也可以發現每當需要轉換一個類時都需要一個適配器,這樣就會導致系統結構變得非常複雜,因此使用時也需要格外注意。
小結
適配器模式可以將一個不兼容的類轉化爲可複用的類,這樣可以使得我們不用添加額外冗餘臃腫的代碼,但同時也會產生許多的適配器類,也會增加系統的複雜性。同時,既然是轉換不兼容的類,那麼該模式應儘可能的用於項目後期的補償,而不是初期的詳細設計中,否則就應該好好考慮下初期設計是否合理。