引言:ide
有一次我看到一個朋友拿出一個三角型的東西,好奇的上去一看你,我勒個去,傳說中的萬能插口轉接器(插口適配器)。spa
一面是插入口,集合了我認識的全部插口的形狀,也有國內沒看見過的;另外一個是跟插座接觸的,也是集合了我見過的全部樣式,固然也有我沒見過的。.net
問了下,這個三角型的東西,全世界通用(前提是跟他的另外一個變壓器一塊兒使用)。這個東西老貴了,不算變壓器,也要兩張毛爺爺多。設計
而這就是現實生活中的適配器模式。code
理解:對象
適配器,就是把原來兩個不能一塊兒使用的東西、模塊、系統,經過中間的一個轉化器,變成兩個東西、模塊、系統能夠鏈接起來一塊兒使用。blog
這個在IT項目中是常常碰到的問題,好比咱們須要在一個已有的系統平臺中,加載咱們開發的模塊系統,那麼受權系統就須要用別人的,繼承
這個時候咱們須要作一個適配器,把平臺中的受權系統封裝後,給咱們系統使用。接口
適配器模式,分兩種:接口適配器和對象適配器。開發
代碼示例:
接口適配器
// 第三方系統的操做 public class OperateUserInfo { public String OperateUser() { return "用戶的姓名"; } }
// 獲取用戶信息接口 public interface IUser { String GetUserName(); } // 實現接口 public class UserAdapter : IUser { OperateUserInfo _opObj = new OperateUserInfo(); public string GetUserName() { return _opObj.OperateUser(); } }
static void Main(string[] args) { // 調用 IUser _userObj = new UserAdapter(); Console.WriteLine(_userObj.GetUserName()); Console.ReadLine(); }
對象適配器
public class User { public virtual String GetUserName() { return String.Empty; } } public class UserAdapter2 : User { OperateUserInfo _opObj = new OperateUserInfo(); public override String GetUserName() { return _opObj.OperateUser(); } }
static void Main(string[] args) { // 調用 IUser _userObj = new UserAdapter(); Console.WriteLine(_userObj.GetUserName()); Console.WriteLine("----"); // User _userObj2 = new UserAdapter2(); Console.WriteLine(_userObj2.GetUserName()); Console.ReadLine(); }
這兩種模式的區別在於,接口的適配是沒有默認實現的,全部的方法都是須要繼承類本身實現的。
而對象模式是,能夠有本身的實現的,這個其實就是抽象類和接口的區別吧。
總結:
一、 對象適配用處是,可使Adaptee沒必要實現不須要的方法,具體就是其表現形式就是父類實現缺省方法,而子類只需實現本身獨特的方法。
二、 適配器類能夠是抽象類。
三、 帶參數的適配器模式。使用這種辦法,適配器類能夠根據參數返還一個合適的實例給客戶端。
應用場景:
一、 系統須要使用現有的類,而此類的接口不符合系統的須要。
二、 想要創建一個能夠重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在未來引進的類一塊兒工做。這些源類不必定有很複雜的接口。
三、 僅對對象適配器而言,在設計裏,須要改變多個已有子類的接口,若是使用類的適配器模式,就要針對每個子類作一個適配器,而這不太實際。
特別描述:
四、代碼IUser _userObj = new UserAdapter();從耦合度來講這行代碼的不符合要求,由於耦合度過高,因此須要咱們設計時解耦。
解耦的方式是,使用反射和泛型的感念,來動態聲明實例。
五、可是這裏的Demo只是說明適配器模式,真真在設計時,如何使用適配器,確定不是Demo中的那樣。
代碼下載: