至誠之道,可以前知
一,定義
適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
適配器模式在我們的開發中使用率極高,ListView,GridView,RecyclerView等都使用了適配器模式,它其實就是將兩個不兼容 的類融合在一起,它有點像粘合劑,將不同的東西通過一種轉換使得他們能夠協作起來。
二,使用場景
1,系統需要使用現有的類,而此類的接口不符合系統的需要,即接口不兼容
2,想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作
3,需要一個統一的輸出接口,而輸入端的類型不可預知
三,角色介紹
1,Target: 目標角色,也就是所期待得到的接口。注意:在類適配器模式中,目標不可以是類
2,Adaptee:現在需要適配的接口
3,Adapter:適配器角色,也是本模式的核心。適配器把源接口轉換成目標接口。顯然,這一角色不可以是接口,而必須是具體類
四,類適配器模式的使用
玩過和平精英吃雞手游的玩家都知道,大家都是在手機或者平板電腦上面用手搓者玩的,這更適合那些沒玩過射擊游戲的新手玩家,但是對于大多數端游老玩家來說,手搓很不習慣,于是王座就誕生了,它可以讓玩家通過鍵鼠模擬手搓在手機或者平板上操作游戲,這里我們就可以把王座看作是適配器角色,目標角色就是鍵鼠操作游戲,Adaptee角色就是手搓操作游戲。
創建一個目標角色接口使用鍵鼠玩游戲:
public interface KeyMouse {void playGameByKM();
}
創建一個適配器角色,王座,可以通過王座玩游戲:
public class Adapter extends Hand implements KeyMouse{@Overridepublic void playGameByKM() {System.out.println("使用鍵鼠輸入操作信號");System.out.println("使用王座將鍵鼠操作信號轉換成模擬手指操作信號");playGameByHand();}
}
創建一個被適配的角色,手搓玩游戲:
public class Hand {public void playGameByHand(){System.out.println("通過手搓玩游戲");}
}
使用:
Adapter adapter =new Adapter();
adapter.playGameByKM();
輸出:
這樣就可以通過王座玩吃雞了。
五,對象適配器模式的使用
與類適配器模式一樣,對象的適配器模式把被適配的類的API轉換成為目標類的API,與類的適配器模式不同的是,對象的適配器模式不是使用繼承關系連接到Adapter類,而是使用代理關系連接到Adapter類。
還是上面那個吃雞的例子。
首先還是創建我們的目標接口來使用鍵鼠玩游戲:
public interface KeyMouse {void playGameByKM();
}
然后創建一個被適配的角色,手搓玩游戲:
public class Hand {public void playGameByHand(){System.out.println("通過手搓玩游戲");}
}
最后創建我們的適配器adapter,王座:
public class KingAdapter implements KeyMouse{private Hand hand;public KingAdapter(Hand hand) {this.hand = hand;}@Overridepublic void playGameByKM() {System.out.println("使用鍵鼠輸入操作信號");System.out.println("使用王座將鍵鼠操作信號轉換成模擬手指操作信號");hand.playGameByHand();}
}
最后在使用時:
KingAdapter adapter =new KingAdapter(new Hand());
adapter.playGameByKM();
輸出:
該方式直接將要被適配的對象傳遞到Adapter中,使用組合的形式實現接口兼容的效果,比類適配器更為靈活,它的另一個好處是被適配對象中的方法不會暴露出來,而類適配器由于繼承了被適配對象,因此,被適配對象類的函數在Adapter類中也都含有,這使得Adapter類出現一些奇怪的接口,用戶使用成本較高,因此,對象適配器模式更加靈活實用。
六,總結
在實際開發中,特別是在自定義view等情況下,適配器模式的應用非常廣泛且具有重大意義。
優點:
1,更好的復用性:系統需要使用現有的類,而次類的接口不符合系統的需要,那么通過適配器模式就可以讓這些功能得到更好的復用。
2,更好的擴展性:在實現適配器功能的時候,可以調用自己開發的功能,從而自然的擴展系統的功能。
缺點:過多的使用適配器,會讓系統非常凌亂,不易整體把握。例如,明明看到調用的是A接口,其實內部被適配成了B接口的實現,一個系統如果太多出現這種情況,無異于一場災難。因此,如果不是很有必要,可以不適用適配器,而是直接對系統進行重構。