解析C#設(shè)計模式編程中適配器模式的實現(xiàn)
在實際的軟件系統(tǒng)設(shè)計和開發(fā)中,為了完成某項工作需要購買一個第三方的庫來加快開發(fā)。這帶來一個問題,在應(yīng)用程序中已經(jīng)設(shè)計好的功能接口,與這個第三方提供的接口不一致。為了使得這些接口不兼容的類可以在一起工作,適配器模式提供了一種接口的適配機(jī)制。
適配器模式的設(shè)計思想在生活中經(jīng)常會應(yīng)用到,如我們在給手機(jī)充電的時候,不可能直接在220V電源上直接充電,而是用手機(jī)充電器轉(zhuǎn)換成手機(jī)需要的電壓才可以正常充電,否則就不可以完成充電,這個充電器就起到了適配的作用。
1、適配器模式簡介
1.1、定義
適配器模式是通過一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使原本由于接口不兼容而不能一起工作的那些類可以一起工作。
適配器從結(jié)構(gòu)上可以分為類適配器和對象適配器。其中類適配器使用繼承關(guān)系來對類進(jìn)行適配,而對象適配器是使用對象引用的方法來進(jìn)行適配的。
C#實現(xiàn)類適配器時,Target只能是接口。實現(xiàn)對象適配器時,Target可以是抽象類也可以是接口。
1.2、使用頻率
2、適配器模式結(jié)構(gòu)
2.1、結(jié)構(gòu)圖
2.2、參與者
適配器模式參與者:
- Target:Client所使用的與特定領(lǐng)域相關(guān)的接口。
- Client:與符合Target接口的對象協(xié)調(diào)的類。
- Adaptee:需要適配的類接口。
- Adapter:適配器,負(fù)責(zé)Adaptee的接口與Target接口進(jìn)行適配。
在適配器模式中,類Adapter實現(xiàn)適配器的功能,它在Client于Adaptee之間加入Adapter,這樣Client把請求發(fā)給接口為Target的類Adapter,再由Adapter調(diào)用Adaptee,從而實現(xiàn)Client調(diào)用Adaptee。
3、類的適配器模式實現(xiàn)
在這里以生活中的一個例子來進(jìn)行演示適配器模式的實現(xiàn),具體場景是: 在生活中,我們買的電器插頭是2個孔的,但是我們買的插座只有三個孔的,此時我們就希望電器的插頭可以轉(zhuǎn)換為三個孔的就好,這樣我們就可以直接把它插在插座上,此時三個孔插頭就是客戶端期待的另一種接口,自然兩個孔的插頭就是現(xiàn)有的接口,適配器模式就是用來完成這種轉(zhuǎn)換的,具體實現(xiàn)代碼如下:
using System; /// 這里以插座和插頭的例子來詮釋適配器模式 /// 現(xiàn)在我們買的電器插頭是2個孔,但是我們買的插座只有3個孔的 /// 這是我們想把電器插在插座上的話就需要一個電適配器 namespace 設(shè)計模式之適配器模式 { /// <summary> /// 客戶端,客戶想要把2個孔的插頭 轉(zhuǎn)變成三個孔的插頭,這個轉(zhuǎn)變交給適配器就好 /// 既然適配器需要完成這個功能,所以它必須同時具體2個孔插頭和三個孔插頭的特征 /// </summary> class Client { static void Main(string[] args) { // 現(xiàn)在客戶端可以通過電適配要使用2個孔的插頭了 IThreeHole threehole = new PowerAdapter(); threehole.Request(); Console.ReadLine(); } } /// <summary> /// 三個孔的插頭,也就是適配器模式中的目標(biāo)角色 /// </summary> public interface IThreeHole { void Request(); } /// <summary> /// 兩個孔的插頭,源角色——需要適配的類 /// </summary> public abstract class TwoHole { public void SpecificRequest() { Console.WriteLine("我是兩個孔的插頭"); } } /// <summary> /// 適配器類,接口要放在類的后面 /// 適配器類提供了三個孔插頭的行為,但其本質(zhì)是調(diào)用兩個孔插頭的方法 /// </summary> public class PowerAdapter:TwoHole,IThreeHole { /// <summary> /// 實現(xiàn)三個孔插頭接口方法 /// </summary> public void Request() { // 調(diào)用兩個孔插頭方法 this.SpecificRequest(); } } }
從上面代碼中可以看出,客戶端希望調(diào)用Request方法(即三個孔插頭),但是我們現(xiàn)有的類(即2個孔的插頭)并沒有Request方法,它只有SpecificRequest方法(即兩個孔插頭本身的方法),然而適配器類(適配器必須實現(xiàn)三個孔插頭接口和繼承兩個孔插頭類)可以提供這種轉(zhuǎn)換,它提供了Request方法的實現(xiàn)(其內(nèi)部調(diào)用的是兩個孔插頭,因為適配器只是一個外殼罷了,包裝著兩個孔插頭(因為只有這樣,電器才能使用),并向外界提供三個孔插頭的外觀,)以供客戶端使用。
4、對象的適配器模式
上面都是類的適配器模式的介紹,然而適配器模式還有另外一種形式——對象的適配器模式,這里就具體講解下它的實現(xiàn),實現(xiàn)的分析思路:既然現(xiàn)在適配器類不能繼承TwoHole抽象類了(因為用繼承就屬于類的適配器了),但是適配器類無論如何都要實現(xiàn)客戶端期待的方法的,即Request方法,所以一定是要繼承ThreeHole抽象類或IThreeHole接口的,然而適配器類的Request方法又必須調(diào)用TwoHole的SpecificRequest方法,又不能用繼承,這時候就想,不能繼承,但是我們可以在適配器類中創(chuàng)建TwoHole對象,然后在Requst中使用TwoHole的方法了。正如我們分析的那樣,對象的適配器模式的實現(xiàn)正式如此。下面就讓我看看具體實現(xiàn)代碼:
namespace 對象的適配器模式
{ class Client { static void Main(string[] args) { // 現(xiàn)在客戶端可以通過電適配要使用2個孔的插頭了 ThreeHole threehole = new PowerAdapter(); threehole.Request(); Console.ReadLine(); } } /// <summary> /// 三個孔的插頭,也就是適配器模式中的目標(biāo)(Target)角色 /// </summary> public class ThreeHole { // 客戶端需要的方法 public virtual void Request() { // 可以把一般實現(xiàn)放在這里 } } /// <summary> /// 兩個孔的插頭,源角色——需要適配的類 /// </summary> public class TwoHole { public void SpecificRequest() { Console.WriteLine("我是兩個孔的插頭"); } } /// <summary> /// 適配器類,這里適配器類沒有TwoHole類, /// 而是引用了TwoHole對象,所以是對象的適配器模式的實現(xiàn) /// </summary> public class PowerAdapter : ThreeHole { // 引用兩個孔插頭的實例,從而將客戶端與TwoHole聯(lián)系起來 public TwoHole twoholeAdaptee = new TwoHole(); /// <summary> /// 實現(xiàn)三個孔插頭接口方法 /// </summary> public override void Request() { twoholeAdaptee.SpecificRequest(); } } }
上一篇:C#中重載與重寫區(qū)別分析
欄 目:C#教程
下一篇:c#使用win32api實現(xiàn)獲取光標(biāo)位置
本文標(biāo)題:解析C#設(shè)計模式編程中適配器模式的實現(xiàn)
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6685.html
您可能感興趣的文章
- 01-10C#編程實現(xiàn)自定義熱鍵的方法
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10深入淺出23種設(shè)計模式
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二
- 01-10C#編程自學(xué)之開篇介紹
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量三
- 01-10C#編程自學(xué)之運算符和表達(dá)式
- 01-10C#編程自學(xué)之類和對象
- 01-10C#編程和Visual Studio使用技巧(下)
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量一


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?