最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析C#設(shè)計模式編程中適配器模式的實現(xiàn)

 更新時間:2016年02月17日 15:48:56   作者:Libing  
這篇文章主要介紹了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、使用頻率

2016217154620830.gif (101×20)

2、適配器模式結(jié)構(gòu)

2.1、結(jié)構(gòu)圖

2016217154702639.png (522×285)

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();
    }
  }
}

相關(guān)文章

  • C#單例模式與多線程用法介紹

    C#單例模式與多線程用法介紹

    這篇文章介紹了C#單例模式與多線程的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C#/VB.NET 在PDF中添加文件包(Portfolio)的方法

    C#/VB.NET 在PDF中添加文件包(Portfolio)的方法

    這篇文章主要介紹了C#/VB.NET 在PDF中添加文件包(Portfolio)的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-06-06
  • C#操作注冊表的方法詳解

    C#操作注冊表的方法詳解

    這篇文章主要介紹了C#操作注冊表的方法,結(jié)合實例形式較為詳細(xì)的分析了C#針對注冊表的創(chuàng)建、打開、讀取、寫入、修改、刪除等技巧,需要的朋友可以參考下
    2015-12-12
  • Unity搖桿制作的方法

    Unity搖桿制作的方法

    這篇文章主要為大家詳細(xì)介紹了Unity搖桿制作的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C#使用iTextSharp操作PDF

    C#使用iTextSharp操作PDF

    這篇文章介紹了C#使用iTextSharp操作PDF的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#使用Shader實現(xiàn)夜幕降臨倒計時的效果

    C#使用Shader實現(xiàn)夜幕降臨倒計時的效果

    這篇文章主要介紹了C#使用Shader實現(xiàn)夜幕降臨倒計時的效果,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • C#集合遍歷時刪除和增加元素的方法

    C#集合遍歷時刪除和增加元素的方法

    這篇文章主要介紹了C#集合遍歷時刪除和增加元素的方法,結(jié)合實例形式分析了C#針對集合元素的遍歷、添加與刪除等操作實現(xiàn)方法與注意事項,需要的朋友可以參考下
    2016-06-06
  • C#Windows窗體設(shè)計之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用

    C#Windows窗體設(shè)計之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用

    這篇文章主要介紹了C#Windows窗體設(shè)計之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • c#泛型學(xué)習(xí)詳解 創(chuàng)建線性鏈表

    c#泛型學(xué)習(xí)詳解 創(chuàng)建線性鏈表

    Visual C# 2.0 的一個最受期待的(或許也是最讓人畏懼)的一個特性就是對于泛型的支持。這篇文章將告訴你泛型用來解決什么樣的問題,以及如何使用它們來提高你的代碼質(zhì)量,還有你不必恐懼泛型的原因
    2014-01-01
  • C# 利用PdfSharp生成Pdf文件的示例

    C# 利用PdfSharp生成Pdf文件的示例

    這篇文章主要介紹了C# 利用PdfSharp生成Pdf文件的示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-04-04

最新評論

临桂县| 贞丰县| 宁海县| 阿克陶县| 宁陵县| 巨野县| 雷山县| 黔江区| 新余市| 句容市| 邢台县| 镇远县| 嫩江县| 太仆寺旗| 多伦县| 松潘县| 桃源县| 襄垣县| 台山市| 奉新县| 横峰县| 融水| 兴国县| 饶阳县| 中方县| 隆德县| 潍坊市| 体育| 长沙市| 清原| 汝南县| 会理县| 阿坝| 潍坊市| 阳春市| 旬邑县| 房产| 临湘市| 玉屏| 柳林县| 宿州市|