今天,我們來說說介面卡模式,所謂的介面卡最貼近我們生活的就是電源介面卡了,在我們的生活中,我們都知道家用額定電壓是220V,但是我們的手機和筆記本等數碼產品額定電壓並不是220V,在我們給手機、電腦充電的時候為什麼不會發生爆炸呢?那是因為我們手機充電器和電腦充電器中內建了電源介面卡,把220v電壓轉換成我們手機和電腦所適合的電壓,這樣,才不會有危險發生。今天,我們就用軟體的形式來實現介面卡模式,首先我們先定義一個描述家用電壓的類,請看程式碼
/// <summary> /// 具體的或抽象的類 /// </summary> class Target { public virtual void Request() { Console.WriteLine("我是額定電壓220V,小心點我很危險!!"); } }
首先我們抽象出一個Target類用來代表家用額定電壓,其實就是一個虛方法,然後列印一句:我是額定電壓220V,小心點我很危險!!接下來,我們再定義一個手機額定電壓吧,請看程式碼
/// <summary> /// 需要適配的類 /// </summary> class Adaptee { public void SpecificRequest() { Console.WriteLine("我是手機使用電壓,手機使用我很安全哦!"); } }
好了,手機額定電壓類就定義完了,接下來,就讓我們請出我們今天的重要人物,介面卡類,這個介面卡需要有怎樣的規則呢,首先,它肯定能接受家用額定電壓220V,其次,它需要把220v轉換為我們需要的電壓,目前我們只需要手機的,所以,它要能轉換成手機使用電壓,所以這個類應該是這樣定義的,請看程式碼
/// <summary> /// 介面卡類 /// </summary> class Adapter : Target { private Adaptee adaptee = new Adaptee();//手機物件 public override void Request() { adaptee.SpecificRequest();//轉換為使用手機額定電壓 } }
首先,它在內部例項化了一個手機額定電壓類,然後繼承了家用220V電壓抽象類,在Request方法內部通過例項化的手機額定電壓例項轉換為手機額定電壓,到這裡,我們的適配是不是就完成了,成功的把220V轉換為手機需要的電壓,接下來,我們來看看上端呼叫實現
class Program { static void Main(string[] args) { Target target = new Adapter(); target.Request(); Console.ReadLine(); } }
首先,Target類是我們被適配的類,也就是我們的目標,Adapter類就是我們的介面卡類,通過 Target target = new Adapter();這行程式碼我們就是在實現適配的過程,就相當於把介面卡插入我們的電源上,最後開啟開關給我們手機充電,適配過程都是在介面卡內部完成,我們可以看看執行結果,最後,我們得到的就是手機使用的電壓了。。
到這裡我們的手機就能安心在家裡充電了,但是我們希望這個介面卡不僅僅只有手機能用,還希望我的筆記本,MP3,Mp4,各種數碼產品都能用這個介面卡轉換成滿足自己的電壓,那我們的這個介面卡模式該怎麼滿足呢??
首先呢,我們共用一個介面卡的話那我們的手機和電腦連線介面卡的介面得一樣吧,所以,首先第一步就是抽象出一個介面,請看程式碼
/// <summary> /// 適配者介面 /// </summary> interface IAdaptee { void SpecificRequest(); }
把我們之前的Adaptee該把改把就是我們需要的介面了,然後我們再建立一個手機適配者類和電腦適配者類,然後他們兩個肯定都要繼承我們建立的IAdaptee介面了,請看程式碼
class AdapteeCompant : IAdaptee { public void SpecificRequest() { Console.WriteLine("我是電腦使用的電壓,電腦使用我很安全哦!!"); } } public class AdapteePhon : IAdaptee { public void SpecificRequest() { Console.WriteLine("我是手機使用的電壓,手機使用我很安全哦!!"); } }
這兩個類都實現了IAdaptee介面的SpecificRequest方法,接下來,我們還需要修改介面卡類,請看程式碼
class Adapter : Target { private readonly IAdaptee _adaptee; public Adapter(IAdaptee adaptee) { _adaptee = adaptee; } public override void Request() { _adaptee.SpecificRequest(); } }
其實沒有多大的修改,只是把我們之前的手機適配者變成了我們現在的適配者介面,通過建構函式注入的方式來引用,最後我們的Request方法用來轉換,好了,現在我們的萬能介面卡已經做好了,接下來讓我們投入使用吧
class Program { static void Main(string[] args) { AdapteePhon adapte = new AdapteePhon(); AdapteeCompant adapteeCompant = new AdapteeCompant(); Target target = new Adapter(adapte); target.Request(); Target targetcom = new Adapter(adapteeCompant); targetcom.Request(); Console.Read(); } }
首先,我們例項化一個手機,一個電腦,然後通過在例項介面卡的時候把手機和電腦注入到介面卡中,最後呼叫request方法,完成轉換
到這裡,我們的萬能介面卡就完成了呢。。。
介面卡模式:將一個介面轉換成客戶希望的另一個介面,是介面不相容的那些類可以一起工作。
所以,介面卡模式最好的詮釋了包一層的效果。