欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門(mén)教程網(wǎng)!

C#教程

當(dāng)前位置:主頁(yè) > 軟件編程 > C#教程 >

C#學(xué)習(xí)筆記之適配器模式詳解

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C#教程|點(diǎn)擊: 次

什么是適配器模式?

   適配器模式(Adapter):將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。

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

什么時(shí)候運(yùn)用適配器模式?

   在想使用一個(gè)已經(jīng)存在的類(lèi)時(shí),如果它的接口,也就是它的方法與我們當(dāng)前的要求不相同時(shí),就需要考慮用到適配器模式了。

   一般而言,使用適配器模式是出于無(wú)奈之舉,一般存在于軟件開(kāi)發(fā)后期或者維護(hù)期,在軟件設(shè)計(jì)階段,我們還是盡量避免該模式的使用。

適配器模式的組成

    Target:目標(biāo)接口,也就是客戶所期待的接口。目標(biāo)可以是具體的或者抽象的類(lèi),也可以是接口。

  Adpatee:需要適配的類(lèi)。也就是我們需要與目標(biāo)接口對(duì)接成功的類(lèi)。

  Adapter:中間起到鏈接作用的類(lèi)。通過(guò)在內(nèi)部包裝一個(gè)Adptee對(duì)象,將源接口轉(zhuǎn)換成目標(biāo)接口。

適配器模式具體實(shí)現(xiàn)

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

適配器模式的實(shí)現(xiàn)

Target類(lèi):也就是目標(biāo)類(lèi)

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

Adaptee類(lèi):需要適配的類(lèi)

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

Adapter類(lèi):

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

主函數(shù)調(diào)用:

static void Main(string[] args)
{
    //對(duì)客戶端來(lái)說(shuō),調(diào)用的是Target的Request()
    Target target = new Aapter();
    target.Request();

    Console.Read();
}

實(shí)例解析

   為了深化理解,我們準(zhǔn)備一個(gè)具體的實(shí)例來(lái)分析。

   姚明作為一個(gè)外籍的球員在進(jìn)入NBA初期,由于英文水平一般,常常聽(tīng)不懂教練的指揮與安排,需要翻譯來(lái)全程跟隨以實(shí)現(xiàn)溝通。請(qǐng)就此來(lái)寫(xiě)出具體的情況。

 分析:

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

具體實(shí)現(xiàn):

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

      Player m = new Guards("B");
      m.Attack();
      
      //通過(guò)翻譯,姚明知道了需要做的事情
      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} 進(jìn)攻", 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} 進(jìn)攻", name);
      }
      public override void Defense()
      {
        Console.WriteLine("中鋒{0} 防守", name);
      }
    }
    /// <summary>
    /// 后衛(wèi)
    /// </summary>
    class Guards : Player
    {
      public Guards(string name) : base(name)
      {
      }
      public override void Attack()
      {
        Console.WriteLine("后衛(wèi){0} 進(jìn)攻", name);
      }
      public override void Defense()
      {
        Console.WriteLine("后衛(wèi){0} 防守", name);
      }
    }
    /// <summary>
    /// 翻譯是繼承于運(yùn)動(dòng)員的,因?yàn)樗枰苯永斫饨叹毜囊馑?
    /// 但是他實(shí)際需要傳達(dá)的是外籍球員,所以他調(diào)用的是外籍球員所理解的方法=>也就是翻譯的作用
    /// </summary>
    class Translator : Player
    {
      private ForeignCenter fc = new ForeignCenter();
      public Translator(string name) : base(name)
      {
        fc.Name = name;
      }
      public override void Attack()
      {
        fc.進(jìn)攻();
      }
      public override void Defense()
      {
        fc.防守();
      }
    }
    /// <summary>
    /// 作為外籍球員,他有自己的姓名和進(jìn)攻防守方式等
    /// 其他的事情交給翻譯就好了
    /// </summary>
    class ForeignCenter
    {
      private string name;
      public string Name
      {
        get { return name; }
        set { name = value; }
      }
      public void 進(jìn)攻()
      {
        Console.WriteLine("外籍中鋒{0} 進(jìn)攻", name);
      }
      public void 防守()
      {
        Console.WriteLine("外籍中鋒{0} 防守", name);
      }
    }
  }

適配器模式的優(yōu)缺點(diǎn)

   像之前提到的適配器能在后期維護(hù)的時(shí)候起到很大的作用,能在開(kāi)發(fā)新的功能的時(shí)候保護(hù)原來(lái)軟件的穩(wěn)定性,但是初期的時(shí)候還是能避免就盡量避免吧!

備注:文中所有代碼及知識(shí)點(diǎn)均來(lái)自于《大話設(shè)計(jì)模式》,本人屬于邊學(xué)邊看邊敲代碼邊總結(jié)的階段。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:C#實(shí)現(xiàn)WPS文件轉(zhuǎn)PDF格式的方法示例

欄    目:C#教程

下一篇:WPF TextBox實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能

本文標(biāo)題:C#學(xué)習(xí)筆記之適配器模式詳解

本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5402.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有