引言:
有一次我看到一個朋友拿出一個三角型的東西,好奇的上去一看你,我勒個去,傳說中的萬能插口轉接器(插口適配器)。
一面是插入口,集合了我認識的所有插口的形狀,也有國內沒看見過的;另一個是跟插座接觸的,也是集合了我見過的所有樣式,當然也有我沒見過的。
問了下,這個三角型的東西,全世界通用(前提是跟他的另一個變壓器一起使用)。這個東西老貴了,不算變壓器,也要兩張毛爺爺多。
而這就是現實生活中的適配器模式。
理解:
適配器,就是把原來兩個不能一起使用的東西、模塊、系統,通過中間的一個轉化器,變成兩個東西、模塊、系統可以連接起來一起使用。
這個在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();}
這兩種模式的區別在于,接口的適配是沒有默認實現的,所有的方法都是需要繼承類自己實現的。而對象模式是,可以有自己的實現的,這個其實就是抽象類和接口的區別吧。
總結:
1、對象適配用處是,可以使Adaptee不必實現不需要的方法,具體就是其表現形式就是父類實現缺省方法,而子類只需實現自己獨特的方法。2、適配器類可以是抽象類。3、帶參數的適配器模式。使用這種辦法,適配器類可以根據參數返還一個合適的實例給客戶端。
應用場景:
1、系統需要使用現有的類,而此類的接口不符合系統的需要。2、想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。這些源類不一定有很復雜的接口。3、僅對對象適配器而言,在設計里,需要改變多個已有子類的接口,如果使用類的適配器模式,就要針對每一個子類做一個適配器,而這不太實際。
特別描述:
4、代碼IUser _userObj = new UserAdapter();從耦合度來說這行代碼的不符合要求,因為耦合度太高,所以需要我們設計時解耦。
解耦的方式是,使用反射和泛型的感念,來動態聲明實例。
5、但是這里的Demo只是說明適配器模式,真真在設計時,如何使用適配器,肯定不是Demo中的那樣。
代碼下載:
百度云盤 http://pan.baidu.com/s/1bn6B7Z5
CSDN http://download.csdn.net/detail/hater22/6850527
新聞熱點
疑難解答