C#學(xué)習(xí)筆記之適配器模式詳解
什么是適配器模式?
適配器模式(Adapter):將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
什么時候運用適配器模式?
在想使用一個已經(jīng)存在的類時,如果它的接口,也就是它的方法與我們當(dāng)前的要求不相同時,就需要考慮用到適配器模式了。
一般而言,使用適配器模式是出于無奈之舉,一般存在于軟件開發(fā)后期或者維護期,在軟件設(shè)計階段,我們還是盡量避免該模式的使用。
適配器模式的組成
Target:目標(biāo)接口,也就是客戶所期待的接口。目標(biāo)可以是具體的或者抽象的類,也可以是接口。
Adpatee:需要適配的類。也就是我們需要與目標(biāo)接口對接成功的類。
Adapter:中間起到鏈接作用的類。通過在內(nèi)部包裝一個Adptee對象,將源接口轉(zhuǎn)換成目標(biāo)接口。
適配器模式具體實現(xiàn)
適配器模式的結(jié)構(gòu)
適配器模式的實現(xiàn)
Target類:也就是目標(biāo)類
class Target { public virtual void Request() { Console.WriteLine("普通請求"); } }
Adaptee類:需要適配的類
class Adaptee { public void SpecificRequest() { Console.WriteLine("特殊請求"); } }
Adapter類:
class Aapter : Target { private Adaptee adaptee = new Adaptee(); /// <summary> /// 這樣就可以把表面調(diào)用Request()方法變成實際調(diào)用SpecificRequest() /// </summary> public override void Request() { adaptee.SpecificRequest(); } }
主函數(shù)調(diào)用:
static void Main(string[] args) { //對客戶端來說,調(diào)用的是Target的Request() Target target = new Aapter(); target.Request(); Console.Read(); }
實例解析
為了深化理解,我們準(zhǔn)備一個具體的實例來分析。
姚明作為一個外籍的球員在進入NBA初期,由于英文水平一般,常常聽不懂教練的指揮與安排,需要翻譯來全程跟隨以實現(xiàn)溝通。請就此來寫出具體的情況。
分析:
在這里,我們不難發(fā)現(xiàn)教練的指揮與安排就是Target,姚明就是Adaptee,而翻譯就理所當(dāng)然成了Adapter,那么我們就能分析出彼此的關(guān)系了。
具體實現(xiàn):
class Program { static void Main(string[] args) { Player b = new Forwards("A"); b.Attack(); Player m = new Guards("B"); m.Attack(); //通過翻譯,姚明知道了需要做的事情 Player ym = new Translator("姚明"); ym.Attack(); ym.Defense(); Console.Read(); } abstract class Player { protected string name; public Player(string name) { this.name = name; } public abstract void Attack(); public abstract void Defense(); } /// <summary> /// 前鋒 /// </summary> class Forwards : Player { public Forwards(string name) : base(name) { } public override void Attack() { Console.WriteLine("前鋒{0} 進攻", name); } public override void Defense() { Console.WriteLine("前鋒{0} 防守", name); } } /// <summary> /// 中鋒 /// </summary> class Center : Player { public Center(string name) : base(name) { } public override void Attack() { Console.WriteLine("中鋒{0} 進攻", name); } public override void Defense() { Console.WriteLine("中鋒{0} 防守", name); } } /// <summary> /// 后衛(wèi) /// </summary> class Guards : Player { public Guards(string name) : base(name) { } public override void Attack() { Console.WriteLine("后衛(wèi){0} 進攻", name); } public override void Defense() { Console.WriteLine("后衛(wèi){0} 防守", name); } } /// <summary> /// 翻譯是繼承于運動員的,因為他需要直接理解教練的意思 /// 但是他實際需要傳達的是外籍球員,所以他調(diào)用的是外籍球員所理解的方法=>也就是翻譯的作用 /// </summary> class Translator : Player { private ForeignCenter fc = new ForeignCenter(); public Translator(string name) : base(name) { fc.Name = name; } public override void Attack() { fc.進攻(); } public override void Defense() { fc.防守(); } } /// <summary> /// 作為外籍球員,他有自己的姓名和進攻防守方式等 /// 其他的事情交給翻譯就好了 /// </summary> class ForeignCenter { private string name; public string Name { get { return name; } set { name = value; } } public void 進攻() { Console.WriteLine("外籍中鋒{0} 進攻", name); } public void 防守() { Console.WriteLine("外籍中鋒{0} 防守", name); } } }
適配器模式的優(yōu)缺點
像之前提到的適配器能在后期維護的時候起到很大的作用,能在開發(fā)新的功能的時候保護原來軟件的穩(wěn)定性,但是初期的時候還是能避免就盡量避免吧!
備注:文中所有代碼及知識點均來自于《大話設(shè)計模式》,本人屬于邊學(xué)邊看邊敲代碼邊總結(jié)的階段。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity?UGUI的PhysicsRaycaster物理射線檢測組件介紹使用
這篇文章主要介紹了Unity?UGUI的PhysicsRaycaster物理射線檢測組件的介紹及使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07在C# WPF下自定義滾動條ScrollViewer樣式的操作
這篇文章主要介紹了在C# WPF下自定義滾動條ScrollViewer樣式的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01WPF使用DrawingContext實現(xiàn)二維繪圖
這篇文章介紹了WPF使用DrawingContext實現(xiàn)二維繪圖的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06