凤凰花 發表於 2022-6-14 08:49:00

C#适配器模式

<h3 id="前言">前言</h3>
<p>我昨天做了个梦,我梦见我在一条路走,走的时候经过一个房间,里面关着一条边牧和鸡和猪,后来我醒了,我知道那只边牧就是小叶子(哈仔十一的边牧),小叶子具备牧羊和牧鸡的技能,因此,假如我想把一只边牧或者一只狗变成小叶子那样,那么首先就得让其赋予牧鸡的本事,而十一(哈仔十一的哈士奇)则具备卖萌的技能</p>
<p><img src="https://img2022.cnblogs.com/blog/1294271/202206/1294271-20220614084737987-1119712334.jpg" alt="" loading="lazy"></p>
<h4 id="适配器模式">适配器模式</h4>
<p>我们先定义一些代码</p>
<pre><code class="language-c#">

    internal interface IDog
    {
      public void Eat();

      public void Bark();
    }


    /// &lt;summary&gt;
    /// 哈士奇
    /// &lt;/summary&gt;
    internal interface IHuskyDog:IDog
    {
      /// &lt;summary&gt;
      /// 破坏、拆家
      /// &lt;/summary&gt;
      public void Demolition();
    }

    /// &lt;summary&gt;
    /// 牧羊犬
    /// &lt;/summary&gt;
    internal interface IShepherdDog:IDog
    {
      /// &lt;summary&gt;
      /// 牧羊
      /// &lt;/summary&gt;
      public void Shepherd();
    }



    /// &lt;summary&gt;
    /// 小叶子、小椰汁
    /// &lt;/summary&gt;
    internal class XiaoYezi : IShepherdDog
    {
      public void Bark()
      {
            Console.WriteLine($"I Am {nameof(XiaoYezi)} 汪 汪 汪 !!!!!");
      }

      public void Eat()
      {
            Console.WriteLine($"I Am {nameof(XiaoYezi)} 好吃 !!!!!");
      }

      /// &lt;summary&gt;
      /// 牧羊
      /// &lt;/summary&gt;
      public void Shepherd()
      {
            Console.WriteLine($"I Am {nameof(XiaoYezi)}, 我在牧羊 !!!!!");
      }
    }


    /// &lt;summary&gt;
    /// 十一
    /// &lt;/summary&gt;
    internal class ShiYi : IHuskyDog
    {
      public void Bark()
      {
            Console.WriteLine($"I Am {nameof(ShiYi)} 汪 汪 汪 !!!!!");
      }

      public void Demolition()
      {
            Console.WriteLine($"I Am {nameof(ShiYi)} ,拆家啦 !!!!!");
      }

      public void Eat()
      {
            Console.WriteLine($"I Am {nameof(ShiYi)} 好吃得停不下来 !!!!!");
      }
    }

</code></pre>
<p>那么,用代码怎么写呢?或许你会定义一个变叶子的接口,有个方法叫<code>HerdingChicken </code>,让其实现牧鸡的技能就行,但是实际上这里有两个主要问题:</p>
<ul>
<li>叶子本身是一个狗,如果其他人实现了这个接口,他能变叶子?是不是前提他是狗</li>
<li>假如叶子不单单只是牧鸡,她会牧鹅、猪、牧自己?还得多接口,或者在变叶子的接口加方法给其实现</li>
</ul>
<p>这时候适配器模式就是可以适应这种情况:</p>
<pre><code class="language-c#"> internal class XiaoYeziAdapter : IShepherdDog
    {
      public IDog Dog { get; set; }

      public XiaoYeziAdapter(IDog dog)
      {
            Dog = dog;
      }

      public void Bark()
      {
            Dog.Bark();
      }

      public void Eat()
      {
            Dog.Eat();
      }

      public void Shepherd()
      {
            if (Dog is IShepherdDog shepherdDog)
            {
                shepherdDog.Shepherd();
            }
      }

      /// &lt;summary&gt;
      /// 牧鸡
      /// &lt;/summary&gt;
      public void HerdingChicken()
      {
            Console.WriteLine($"{Dog.GetType().Name} is Herding Chicken");
      }
    }


</code></pre>
<p>代码如下:</p>
<pre><code class="language-c#">
var xiaoYezi = new XiaoYezi();
var xiaoYeziAdapter = new XiaoYeziAdapter(xiaoYezi);
xiaoYeziAdapter.Bark();
xiaoYeziAdapter.Eat();
xiaoYeziAdapter.HerdingChicken();

Console.WriteLine("---------------- \n");

var shiYi = new ShiYi();
xiaoYeziAdapter = new XiaoYeziAdapter(shiYi);
xiaoYeziAdapter.Bark();
xiaoYeziAdapter.Eat();
xiaoYeziAdapter.HerdingChicken();

</code></pre>
<p>输出:</p>
<pre><code>I Am XiaoYezi 汪 汪 汪 !!!!!
I Am XiaoYezi 好吃 !!!!!
XiaoYezi 在牧鸡
----------------

I Am ShiYi 汪 汪 汪 !!!!!
I Am ShiYi 好吃得停不下来 !!!!!
ShiYi 在牧鸡

</code></pre>
<p>可以看到,十一用了小叶子适配器,也具备了牧鸡的功能<br>
<img src="https://img2022.cnblogs.com/blog/1294271/202206/1294271-20220614084755399-958667306.jpg" alt="" loading="lazy"></p>
<p>那么反过来,叶子变十一呢?那就定义一个十一适配器呗</p>
<p><img src="https://img2022.cnblogs.com/blog/1294271/202206/1294271-20220614084809351-703064485.jpg" alt="" loading="lazy"></p>
<pre><code class="language-c#">
internal class ShiYiAdapter : IHuskyDog
    {
      public IDog Dog { get; set; }

      public ShiYiAdapter(IDog dog)
      {
            Dog=dog;
      }

      /// &lt;summary&gt;
      /// 吠
      /// &lt;/summary&gt;
      /// &lt;exception cref="NotImplementedException"&gt;&lt;/exception&gt;
      public void Bark()
      {
            Dog.Bark();
      }

      /// &lt;summary&gt;
      /// 拆家
      /// &lt;/summary&gt;
      /// &lt;exception cref="NotImplementedException"&gt;&lt;/exception&gt;
      public void Demolition()
      {
            if (Dog is IHuskyDog huskyDog)
            {
                huskyDog.Demolition();
            }
      }

      /// &lt;summary&gt;
      /// 吃
      /// &lt;/summary&gt;
      /// &lt;exception cref="NotImplementedException"&gt;&lt;/exception&gt;
      public void Eat()
      {
            Dog.Eat();
      }

      /// &lt;summary&gt;
      /// 卖萌
      /// &lt;/summary&gt;
      public void ActingCute()
      {
            Console.WriteLine($"{Dog.GetType().Name} 卖萌啦!!");
      }
    }

</code></pre>
<p>代码如下:</p>
<pre><code class="language-c#">
var xiaoYezi = new XiaoYezi();
var shiYiAdapter = new ShiYiAdapter(xiaoYezi);
shiYiAdapter.Bark();
shiYiAdapter.ActingCute();
shiYiAdapter.Demolition();

Console.WriteLine("---------------- \n");

var shiYi = new ShiYi();
shiYiAdapter = new ShiYiAdapter(shiYi);
shiYiAdapter.Bark();
shiYiAdapter.ActingCute();
shiYiAdapter.Demolition();

</code></pre>
<p>输出:</p>
<pre><code>I Am XiaoYezi 汪 汪 汪 !!!!!
XiaoYezi 卖萌啦!!
----------------

I Am ShiYi 汪 汪 汪 !!!!!
ShiYi 卖萌啦!!
I Am ShiYi ,拆家啦 !!!!!

</code></pre>
<p>看,小叶子具备卖萌的技能了,而且由于拆家是哈士奇的技能,因此小叶子拆家没拆到,实际上,或者卖萌和牧鸡只是哈仔十一(大哈)家的特色,那么是不是可以定义一个大哈家的适配器</p>
<p><img src="https://img2022.cnblogs.com/blog/1294271/202206/1294271-20220614084821165-2021945320.jpg" alt="" loading="lazy"></p>
<pre><code class="language-c#">
    /// &lt;summary&gt;
    /// 哈仔十一家的狗适配器
    /// &lt;/summary&gt;
    internal class DaHaFamilyDogAdapter
    {
      public IDog Dog { get; set; }

      public DaHaFamilyDogAdapter(IDog dog)
      {
            Dog = dog;
      }

      /// &lt;summary&gt;
      /// 牧鸡
      /// &lt;/summary&gt;
      public void HerdingChicken()
      {
            Console.WriteLine($"{Dog.GetType().Name} 在牧鸡");
      }

      /// &lt;summary&gt;
      /// 卖萌
      /// &lt;/summary&gt;
      public void ActingCute()
      {
            Console.WriteLine($"{Dog.GetType().Name} 在卖萌");
      }
    }

</code></pre>
<p>那么</p>
<pre><code class="language-c#">var xiaoYezi = new XiaoYezi();
var daHaFamilyDogAdapter = new DaHaFamilyDogAdapter(xiaoYezi);
daHaFamilyDogAdapter.Bark();
daHaFamilyDogAdapter.Eat();
daHaFamilyDogAdapter.HerdingChicken();
daHaFamilyDogAdapter.ActingCute();

Console.WriteLine("---------------- \n");

var shiYi = new ShiYi();
daHaFamilyDogAdapter = new DaHaFamilyDogAdapter(shiYi);
daHaFamilyDogAdapter.Bark();
daHaFamilyDogAdapter.Eat();
daHaFamilyDogAdapter.HerdingChicken();
daHaFamilyDogAdapter.ActingCute();

</code></pre>
<p>输出:</p>
<pre><code>I Am XiaoYezi 汪 汪 汪 !!!!!
I Am XiaoYezi 好吃 !!!!!
XiaoYezi 在牧鸡
XiaoYezi 在卖萌
----------------

I Am ShiYi 汪 汪 汪 !!!!!
I Am ShiYi 好吃得停不下来 !!!!!
ShiYi 在牧鸡
ShiYi 在卖萌

</code></pre><br><br>
来源:https://www.cnblogs.com/ryzen/p/16373077.html
頁: [1]
查看完整版本: C#适配器模式