程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 解析C#設計模式編程中適配器模式的實現

解析C#設計模式編程中適配器模式的實現

編輯:關於C語言

在實際的軟件系統設計和開發中,為了完成某項工作需要購買一個第三方的庫來加快開發。這帶來一個問題,在應用程序中已經設計好的功能接口,與這個第三方提供的接口不一致。為了使得這些接口不兼容的類可以在一起工作,適配器模式提供了一種接口的適配機制。


  適配器模式的設計思想在生活中經常會應用到,如我們在給手機充電的時候,不可能直接在220V電源上直接充電,而是用手機充電器轉換成手機需要的電壓才可以正常充電,否則就不可以完成充電,這個充電器就起到了適配的作用。

1、適配器模式簡介

1.1、定義

  適配器模式是通過一個類的接口轉換成客戶希望的另外一個接口,使原本由於接口不兼容而不能一起工作的那些類可以一起工作。

  適配器從結構上可以分為類適配器和對象適配器。其中類適配器使用繼承關系來對類進行適配,而對象適配器是使用對象引用的方法來進行適配的。

  C#實現類適配器時,Target只能是接口。實現對象適配器時,Target可以是抽象類也可以是接口。

1.2、使用頻率

2016217154620830.gif (101×20)

2、適配器模式結構

2.1、結構圖

2016217154702639.png (522×285)

2.2、參與者

  適配器模式參與者:

  •   Target:ClIEnt所使用的與特定領域相關的接口。
  •   ClIEnt:與符合Target接口的對象協調的類。
  •   Adaptee:需要適配的類接口。
  •   Adapter:適配器,負責Adaptee的接口與Target接口進行適配。

  在適配器模式中,類Adapter實現適配器的功能,它在Client於Adaptee之間加入Adapter,這樣Client把請求發給接口為Target的類Adapter,再由Adapter調用Adaptee,從而實現ClIEnt調用Adaptee。

3、類的適配器模式實現
在這裡以生活中的一個例子來進行演示適配器模式的實現,具體場景是: 在生活中,我們買的電器插頭是2個孔的,但是我們買的插座只有三個孔的,此時我們就希望電器的插頭可以轉換為三個孔的就好,這樣我們就可以直接把它插在插座上,此時三個孔插頭就是客戶端期待的另一種接口,自然兩個孔的插頭就是現有的接口,適配器模式就是用來完成這種轉換的,具體實現代碼如下:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 using System; /// 這裡以插座和插頭的例子來诠釋適配器模式 /// 現在我們買的電器插頭是2個孔,但是我們買的插座只有3個孔的 /// 這是我們想把電器插在插座上的話就需要一個電適配器 namespace 設計模式之適配器模式 { /// <summary> /// 客戶端,客戶想要把2個孔的插頭 轉變成三個孔的插頭,這個轉變交給適配器就好 /// 既然適配器需要完成這個功能,所以它必須同時具體2個孔插頭和三個孔插頭的特征 /// </summary> class ClIEnt { static void Main(string[] args) { // 現在客戶端可以通過電適配要使用2個孔的插頭了 IThreeHole threehole = new PowerAdapter(); threehole.Request(); Console.ReadLine(); } } /// <summary> /// 三個孔的插頭,也就是適配器模式中的目標角色 /// </summary> public interface IThreeHole { void Request(); } /// <summary> /// 兩個孔的插頭,源角色——需要適配的類 /// </summary> public abstract class TwoHole { public void SpecificRequest() { Console.WriteLine("我是兩個孔的插頭"); } } /// <summary> /// 適配器類,接口要放在類的後面 /// 適配器類提供了三個孔插頭的行為,但其本質是調用兩個孔插頭的方法 /// </summary> public class PowerAdapter:TwoHole,IThreeHole { /// <summary> /// 實現三個孔插頭接口方法 /// </summary> public void Request() { // 調用兩個孔插頭方法 this.SpecificRequest(); } } }

從上面代碼中可以看出,客戶端希望調用Request方法(即三個孔插頭),但是我們現有的類(即2個孔的插頭)並沒有Request方法,它只有SpecificRequest方法(即兩個孔插頭本身的方法),然而適配器類(適配器必須實現三個孔插頭接口和繼承兩個孔插頭類)可以提供這種轉換,它提供了Request方法的實現(其內部調用的是兩個孔插頭,因為適配器只是一個外殼罷了,包裝著兩個孔插頭(因為只有這樣,電器才能使用),並向外界提供三個孔插頭的外觀,)以供客戶端使用。

4、對象的適配器模式
上面都是類的適配器模式的介紹,然而適配器模式還有另外一種形式——對象的適配器模式,這裡就具體講解下它的實現,實現的分析思路:既然現在適配器類不能繼承TwoHole抽象類了(因為用繼承就屬於類的適配器了),但是適配器類無論如何都要實現客戶端期待的方法的,即Request方法,所以一定是要繼承ThreeHole抽象類或IThreeHole接口的,然而適配器類的Request方法又必須調用TwoHole的SpecificRequest方法,又不能用繼承,這時候就想,不能繼承,但是我們可以在適配器類中創建TwoHole對象,然後在Requst中使用TwoHole的方法了。正如我們分析的那樣,對象的適配器模式的實現正式如此。下面就讓我看看具體實現代碼:

namespace 對象的適配器模式

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 { class ClIEnt { static void Main(string[] args) { // 現在客戶端可以通過電適配要使用2個孔的插頭了 ThreeHole threehole = new PowerAdapter(); threehole.Request(); Console.ReadLine(); } } /// <summary> /// 三個孔的插頭,也就是適配器模式中的目標(Target)角色 /// </summary> public class ThreeHole { // 客戶端需要的方法 public virtual void Request() { // 可以把一般實現放在這裡 } } /// <summary> /// 兩個孔的插頭,源角色——需要適配的類 /// </summary> public class TwoHole { public void SpecificRequest() { Console.WriteLine("我是兩個孔的插頭"); } } /// <summary> /// 適配器類,這裡適配器類沒有TwoHole類, /// 而是引用了TwoHole對象,所以是對象的適配器模式的實現 /// </summary> public class PowerAdapter : ThreeHole { // 引用兩個孔插頭的實例,從而將客戶端與TwoHole聯系起來 public TwoHole twoholeAdaptee = new TwoHole(); /// <summary> /// 實現三個孔插頭接口方法 /// </summary> public override void Request() { twoholeAdaptee.SpecificRequest(); } } }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved