一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - 解析C#設計模式編程中適配器模式的實現

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

2021-11-12 15:20Libing C#

這篇文章主要介紹了C#設計模式編程中適配器模式的實現,分別舉了類的對象適配器與對象的適配器模式的例子,需要的朋友可以參考下

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


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

1、適配器模式簡介

1.1、定義

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

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

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

1.2、使用頻率

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

 

2、適配器模式結構

2.1、結構圖

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

 

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

 

延伸 · 閱讀

精彩推薦
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
主站蜘蛛池模板: 国产精品久久久久久久久久久搜索 | 日本艳鉧动漫1~6在线观看 | 亚洲精品乱码久久久久久蜜桃图片 | ssni-497新任美脚女教师 | 天天黄视频 | 亚洲男人的天堂视频 | 亚欧日韩| 91chinese 永久免费 | 爱情岛论坛自拍永久入口 | 国产乱人乱精一区二区视频密 | 合欢视频免费 | 免费观看一级一片 | 白丝超短裙被输出娇喘不停小说 | 亚裔maricahase和黑人 | 国产真实乱子伦xxxxchina | 99久久免费国产精品热 | 门卫老张和女警花小说 | 小黄鸭YELLOWDUCK7596 | 亚洲国产日韩欧美在线vip1区 | 99re最新网址 | 午夜福利电影网站鲁片大全 | 香蕉eeww99国产精选播放 | 青青草国产精品免费 | 国产一区二区三区四卡 | 日韩 国产 欧美 精品 在线 | 日本成熟 | 好看华人华人经典play | 午夜网 | 东方影视欧美天天影院 | 91麻豆精品国产片在线观看 | 亚洲成色WWW久久网站夜月 | 男女视频在线观看 | 精品久久99麻豆蜜桃666 | 含羞草国产亚洲精品岁国产精品 | 91精品国产免费久久 | 香蕉精品高清在线观看视频 | 校花被扒开尿口折磨憋尿 | 久久99re2在线视频精品 | jzz大全部 | 国产精品嫩草影院在线 | 手机看片自拍 |