1. 概述java
將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠在一塊兒工做。設計模式
2. 解決的問題ide
即Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠在一塊兒工做。spa
3. 模式中的角色設計
3.1 目標接口(Target):客戶所期待的接口。目標能夠是具體的或抽象的類,也能夠是接口。code
3.2 須要適配的類(Adaptee):須要適配的類或適配者類。對象
3.3 適配器(Adapter):經過包裝一個須要適配的對象,把原接口轉換成目標接口。 繼承
4. 模式解讀接口
注:在GoF的設計模式中,對適配器模式講了兩種類型,類適配器模式和對象適配器模式。因爲類適配器模式經過多重繼承對一個接口與另外一個接口進行匹配,而C#、java等語言都不支持多重繼承,於是這裏只是介紹對象適配器。ci
4.1 適配器模式的類圖
4.2 適配器模式的代碼實現
/// <summary> /// 定義客戶端期待的接口 /// </summary> public class Target { /// <summary> /// 使用virtual修飾以便子類能夠重寫 /// </summary> public virtual void Request() { Console.WriteLine("This is a common request"); } } /// <summary> /// 定義須要適配的類 /// </summary> public class Adaptee { public void SpecificRequest() { Console.WriteLine("This is a special request."); } } /// <summary> /// 定義適配器 /// </summary> public class Adapter:Target { // 創建一個私有的Adeptee對象 private Adaptee adaptee = new Adaptee(); /// <summary> /// 經過重寫,表面上調用Request()方法,變成了實際調用SpecificRequest() /// </summary> public override void Request() { adaptee.SpecificRequest(); } }
4.3 客戶端代碼
class Program { static void Main(string[] args) { // 對客戶端來講,調用的就是Target的Request() Target target = new Adapter(); target.Request(); Console.Read(); } }
運行結果
5. 模式總結
5.1 優勢
5.1.1 經過適配器,客戶端能夠調用同一接口,於是對客戶端來講是透明的。這樣作更簡單、更直接、更緊湊。
5.1.2 複用了現存的類,解決了現存類和複用環境要求不一致的問題。
5.1.3 將目標類和適配者類解耦,經過引入一個適配器類重用現有的適配者類,而無需修改原有代碼。
5.1.4 一個對象適配器能夠把多個不一樣的適配者類適配到同一個目標,也就是說,同一個適配器能夠把適配者類和它的子類都適配到目標接口。
5.2 缺點
對於對象適配器來講,更換適配器的實現過程比較複雜。
5.3 適用場景
5.3.1 系統須要使用現有的類,而這些類的接口不符合系統的接口。
5.3.2 想要創建一個能夠重用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在未來引進的類一塊兒工做。
5.3.3 兩個類所作的事情相同或類似,可是具備不一樣接口的時候。
5.3.4 舊的系統開發的類已經實現了一些功能,可是客戶端卻只能以另外接口的形式訪問,但咱們不但願手動更改原有類的時候。
5.3.5 使用第三方組件,組件接口定義和本身定義的不一樣,不但願修改本身的接口,可是要使用第三方組件接口的功能。
6. 適配器應用舉例
6.1 使用過ADO.NET的開發人員應該都用過DataAdapter,它就是用做DataSet和數據源之間的適配器。DataAdapter經過映射Fill和Update來提供這一適配器。
6.2 手機電源適配器