C#學(xué)習(xí)筆記之適配器模式詳解
什么是適配器模式?
適配器模式(Adapter):將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。
什么時(shí)候運(yùn)用適配器模式?
在想使用一個(gè)已經(jīng)存在的類(lèi)時(shí),如果它的接口,也就是它的方法與我們當(dāng)前的要求不相同時(shí),就需要考慮用到適配器模式了。
一般而言,使用適配器模式是出于無(wú)奈之舉,一般存在于軟件開(kāi)發(fā)后期或者維護(hù)期,在軟件設(shè)計(jì)階段,我們還是盡量避免該模式的使用。
適配器模式的組成
Target:目標(biāo)接口,也就是客戶所期待的接口。目標(biāo)可以是具體的或者抽象的類(lèi),也可以是接口。
Adpatee:需要適配的類(lèi)。也就是我們需要與目標(biāo)接口對(duì)接成功的類(lèi)。
Adapter:中間起到鏈接作用的類(lèi)。通過(guò)在內(nèi)部包裝一個(gè)Adptee對(duì)象,將源接口轉(zhuǎn)換成目標(biāo)接口。
適配器模式具體實(shí)現(xiàn)
適配器模式的結(jié)構(gòu)
適配器模式的實(shí)現(xiàn)
Target類(lèi):也就是目標(biāo)類(lèi)
class Target { public virtual void Request() { Console.WriteLine("普通請(qǐng)求"); } }
Adaptee類(lèi):需要適配的類(lèi)
class Adaptee { public void SpecificRequest() { Console.WriteLine("特殊請(qǐng)求"); } }
Adapter類(lèi):
class Aapter : Target { private Adaptee adaptee = new Adaptee(); /// <summary> /// 這樣就可以把表面調(diào)用Request()方法變成實(shí)際調(diào)用SpecificRequest() /// </summary> public override void Request() { adaptee.SpecificRequest(); } }
主函數(shù)調(diào)用:
static void Main(string[] args) { //對(duì)客戶端來(lái)說(shuō),調(diào)用的是Target的Request() Target target = new Aapter(); target.Request(); Console.Read(); }
實(shí)例解析
為了深化理解,我們準(zhǔn)備一個(gè)具體的實(shí)例來(lái)分析。
姚明作為一個(gè)外籍的球員在進(jìn)入NBA初期,由于英文水平一般,常常聽(tīng)不懂教練的指揮與安排,需要翻譯來(lái)全程跟隨以實(shí)現(xiàn)溝通。請(qǐng)就此來(lái)寫(xiě)出具體的情況。
分析:
在這里,我們不難發(fā)現(xiàn)教練的指揮與安排就是Target,姚明就是Adaptee,而翻譯就理所當(dāng)然成了Adapter,那么我們就能分析出彼此的關(guān)系了。
具體實(shí)現(xiàn):
class Program { static void Main(string[] args) { Player b = new Forwards("A"); b.Attack(); Player m = new Guards("B"); m.Attack(); //通過(guò)翻譯,姚明知道了需要做的事情 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} 進(jìn)攻", 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} 進(jìn)攻", 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} 進(jìn)攻", name); } public override void Defense() { Console.WriteLine("后衛(wèi){0} 防守", name); } } /// <summary> /// 翻譯是繼承于運(yùn)動(dòng)員的,因?yàn)樗枰苯永斫饨叹毜囊馑? /// 但是他實(shí)際需要傳達(dá)的是外籍球員,所以他調(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.進(jìn)攻(); } public override void Defense() { fc.防守(); } } /// <summary> /// 作為外籍球員,他有自己的姓名和進(jìn)攻防守方式等 /// 其他的事情交給翻譯就好了 /// </summary> class ForeignCenter { private string name; public string Name { get { return name; } set { name = value; } } public void 進(jìn)攻() { Console.WriteLine("外籍中鋒{0} 進(jìn)攻", name); } public void 防守() { Console.WriteLine("外籍中鋒{0} 防守", name); } } }
適配器模式的優(yōu)缺點(diǎn)
像之前提到的適配器能在后期維護(hù)的時(shí)候起到很大的作用,能在開(kāi)發(fā)新的功能的時(shí)候保護(hù)原來(lái)軟件的穩(wěn)定性,但是初期的時(shí)候還是能避免就盡量避免吧!
備注:文中所有代碼及知識(shí)點(diǎn)均來(lái)自于《大話設(shè)計(jì)模式》,本人屬于邊學(xué)邊看邊敲代碼邊總結(jié)的階段。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C#實(shí)現(xiàn)WPS文件轉(zhuǎn)PDF格式的方法示例
欄 目:C#教程
下一篇:WPF TextBox實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能
本文標(biāo)題:C#學(xué)習(xí)筆記之適配器模式詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5402.html
您可能感興趣的文章
- 01-10C#一個(gè)簡(jiǎn)單的定時(shí)小程序?qū)崿F(xiàn)代碼
- 01-10微信開(kāi)放平臺(tái)之網(wǎng)站授權(quán)微信登錄功能
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類(lèi)型和變量二
- 01-10C#編程自學(xué)之開(kāi)篇介紹
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類(lèi)型和變量三
- 01-10C#編程自學(xué)之運(yùn)算符和表達(dá)式
- 01-10C#編程自學(xué)之類(lèi)和對(duì)象
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類(lèi)型和變量一
- 01-10C#編程自學(xué)之流程控制語(yǔ)句
- 01-10C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(1)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)