C#适配器模式的使用

作者:RyzenAdorer 时间:2022-02-05 15:47:21 

前言

我昨天做了个梦,我梦见我在一条路走,走的时候经过一个房间,里面关着一条边牧和鸡和猪,后来我醒了,我知道那只边牧就是小叶子(哈仔十一的边牧),小叶子具备牧羊和牧鸡的技能,因此,假如我想把一只边牧或者一只狗变成小叶子那样,那么首先就得让其赋予牧鸡的本事,而十一(哈仔十一的哈士奇)则具备卖萌的技能

C#适配器模式的使用

适配器模式

我们先定义一些代码

internal interface IDog
   {
       public void Eat();

public void Bark();
   }

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

/// <summary>
   /// 牧羊犬
   /// </summary>
   internal interface IShepherdDog:IDog
   {
       /// <summary>
       /// 牧羊
       /// </summary>
       public void Shepherd();
   }

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

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

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

/// <summary>
   /// 十一
   /// </summary>
   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)} 好吃得停不下来 !!!!!");
       }
   }

那么,用代码怎么写呢?或许你会定义一个变叶子的接口,有个方法叫HerdingChicken ,让其实现牧鸡的技能就行,但是实际上这里有两个主要问题:

  • 叶子本身是一个狗,如果其他人实现了这个接口,他能变叶子?是不是前提他是狗

  • 假如叶子不单单只是牧鸡,她会牧鹅、猪、牧自己?还得多接口,或者在变叶子的接口加方法给其实现

这时候适配器模式就是可以适应这种情况:

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

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

代码如下:

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

输出:

I Am XiaoYezi 汪 汪 汪 !!!!!
I Am XiaoYezi 好吃 !!!!!
XiaoYezi 在牧鸡
----------------

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

可以看到,十一用了小叶子适配器,也具备了牧鸡的功能

C#适配器模式的使用

那么反过来,叶子变十一呢?那就定义一个十一适配器呗

C#适配器模式的使用


internal class ShiYiAdapter : IHuskyDog
   {
       public IDog Dog { get; set; }

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

/// <summary>
       /// 吠
       /// </summary>
       /// <exception cref="NotImplementedException"></exception>
       public void Bark()
       {
           Dog.Bark();
       }

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

/// <summary>
       /// 吃
       /// </summary>
       /// <exception cref="NotImplementedException"></exception>
       public void Eat()
       {
           Dog.Eat();
       }

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

代码如下:

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

输出:

I Am XiaoYezi 汪 汪 汪 !!!!!
XiaoYezi 卖萌啦!!
----------------

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

看,小叶子具备卖萌的技能了,而且由于拆家是哈士奇的技能,因此小叶子拆家没拆到,实际上,或者卖萌和牧鸡只是哈仔十一(大哈)家的特色,那么是不是可以定义一个大哈家的适配器

C#适配器模式的使用

/// <summary>
   /// 哈仔十一家的狗适配器
   /// </summary>
   internal class DaHaFamilyDogAdapter
   {
       public IDog Dog { get; set; }

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

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

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

那么

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

输出:

I Am XiaoYezi 汪 汪 汪 !!!!!
I Am XiaoYezi 好吃 !!!!!
XiaoYezi 在牧鸡
XiaoYezi 在卖萌
----------------

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

来源:https://www.cnblogs.com/ryzen/p/16373077.html

标签:C#,适配器模式
0
投稿

猜你喜欢

  • springboot 整合 sa-token简介及入门教程

    2023-03-24 01:10:45
  • Flutter 状态管理的实现

    2023-08-21 02:38:33
  • java多线程实现下载图片并压缩

    2023-01-17 22:28:34
  • java关键字final使用方法详解

    2023-11-28 22:38:04
  • 基于SpringBoot多线程@Async的使用体验

    2021-07-15 04:47:04
  • java Springboot实现多文件上传功能

    2023-11-09 04:31:32
  • c#使用process.start启动程序报错解决方法

    2021-07-28 01:20:20
  • C# 填充Excel图表、图例背景色的实例代码

    2023-08-06 04:01:31
  • C#使用FileStream复制一个任意文件

    2022-04-17 19:55:17
  • Java基于递归和循环两种方式实现未知维度集合的笛卡尔积算法示例

    2021-07-19 04:41:18
  • Spring整合SpringMVC与Mybatis(SSM)实现完整登录功能流程详解

    2022-07-15 10:19:25
  • java动态线程池的简单实现思路

    2023-10-18 15:53:46
  • C#怎样才能将XML文件导入SQL Server

    2022-02-16 17:51:13
  • Spring AOP面向切面编程实现原理方法详解

    2021-07-22 00:26:07
  • MyBatis的SQL执行结果和客户端执行结果不一致问题排查

    2022-12-30 20:37:22
  • C# memcached缓存使用实例代码

    2022-01-15 02:17:11
  • Hadoop1.2中配置伪分布式的实例

    2023-01-26 12:20:56
  • Java中类的定义与实例化详解

    2022-10-25 23:18:43
  • java实现简单石头剪刀布游戏

    2023-07-20 05:31:37
  • JAVA设计模式之建造者模式原理与用法详解

    2022-09-25 19:43:04
  • asp之家 软件编程 m.aspxhome.com