中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#學習筆記之適配器模式詳解

發布時間:2020-09-06 14:09:40 來源:腳本之家 閱讀:145 作者:可達鴨要進化 欄目:編程語言

什么是適配器模式?

   適配器模式(Adapter):將一個類的接口轉換成客戶希望的另外一個接口。

   Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。

什么時候運用適配器模式?

   在想使用一個已經存在的類時,如果它的接口,也就是它的方法與我們當前的要求不相同時,就需要考慮用到適配器模式了。

   一般而言,使用適配器模式是出于無奈之舉,一般存在于軟件開發后期或者維護期,在軟件設計階段,我們還是盡量避免該模式的使用。

適配器模式的組成

    Target:目標接口,也就是客戶所期待的接口。目標可以是具體的或者抽象的類,也可以是接口。

  Adpatee:需要適配的類。也就是我們需要與目標接口對接成功的類。

  Adapter:中間起到鏈接作用的類。通過在內部包裝一個Adptee對象,將源接口轉換成目標接口。

適配器模式具體實現

適配器模式的結構

C#學習筆記之適配器模式詳解

適配器模式的實現

Target類:也就是目標類

class Target
{
  public virtual void Request()
  {
     Console.WriteLine("普通請求");
   }
}

Adaptee類:需要適配的類

class Adaptee
{
   public void SpecificRequest()
   {
     Console.WriteLine("特殊請求");
   }
}

Adapter類:

class Aapter : Target
{ 
   private Adaptee adaptee = new Adaptee();
   /// <summary>
   /// 這樣就可以把表面調用Request()方法變成實際調用SpecificRequest()
   /// </summary>
   public override void Request()
   {
     adaptee.SpecificRequest();
   }
}

主函數調用:

static void Main(string[] args)
{
    //對客戶端來說,調用的是Target的Request()
    Target target = new Aapter();
    target.Request();

    Console.Read();
}

實例解析

   為了深化理解,我們準備一個具體的實例來分析。

   姚明作為一個外籍的球員在進入NBA初期,由于英文水平一般,常常聽不懂教練的指揮與安排,需要翻譯來全程跟隨以實現溝通。請就此來寫出具體的情況。

 分析:

   在這里,我們不難發現教練的指揮與安排就是Target,姚明就是Adaptee,而翻譯就理所當然成了Adapter,那么我們就能分析出彼此的關系了。

C#學習筆記之適配器模式詳解

具體實現:

class Program
  {
    static void Main(string[] args)
    {
      Player b = new Forwards("A");
      b.Attack();

      Player m = new Guards("B");
      m.Attack();
      
      //通過翻譯,姚明知道了需要做的事情
      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} 進攻", 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} 進攻", name);
      }
      public override void Defense()
      {
        Console.WriteLine("中鋒{0} 防守", name);
      }
    }
    /// <summary>
    /// 后衛
    /// </summary>
    class Guards : Player
    {
      public Guards(string name) : base(name)
      {
      }
      public override void Attack()
      {
        Console.WriteLine("后衛{0} 進攻", name);
      }
      public override void Defense()
      {
        Console.WriteLine("后衛{0} 防守", name);
      }
    }
    /// <summary>
    /// 翻譯是繼承于運動員的,因為他需要直接理解教練的意思
    /// 但是他實際需要傳達的是外籍球員,所以他調用的是外籍球員所理解的方法=>也就是翻譯的作用
    /// </summary>
    class Translator : Player
    {
      private ForeignCenter fc = new ForeignCenter();
      public Translator(string name) : base(name)
      {
        fc.Name = name;
      }
      public override void Attack()
      {
        fc.進攻();
      }
      public override void Defense()
      {
        fc.防守();
      }
    }
    /// <summary>
    /// 作為外籍球員,他有自己的姓名和進攻防守方式等
    /// 其他的事情交給翻譯就好了
    /// </summary>
    class ForeignCenter
    {
      private string name;
      public string Name
      {
        get { return name; }
        set { name = value; }
      }
      public void 進攻()
      {
        Console.WriteLine("外籍中鋒{0} 進攻", name);
      }
      public void 防守()
      {
        Console.WriteLine("外籍中鋒{0} 防守", name);
      }
    }
  }

適配器模式的優缺點

   像之前提到的適配器能在后期維護的時候起到很大的作用,能在開發新的功能的時候保護原來軟件的穩定性,但是初期的時候還是能避免就盡量避免吧!

備注:文中所有代碼及知識點均來自于《大話設計模式》,本人屬于邊學邊看邊敲代碼邊總結的階段。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐都县| 友谊县| 永胜县| 罗山县| 巧家县| 长乐市| 防城港市| 旌德县| 南宁市| 临江市| 宝坻区| 新建县| 册亨县| 湟源县| 涞源县| 中牟县| 濮阳市| 日照市| 会昌县| 周宁县| 双辽市| 时尚| 东乌| 长沙县| 汝州市| 保定市| 宽甸| 宜城市| 德清县| 靖宇县| 谢通门县| 北流市| 桃园县| 竹山县| 安多县| 秭归县| 永宁县| 陈巴尔虎旗| 甘谷县| 山阴县| 苏州市|