C#适配器模式的使用
作者:RyzenAdorer 发布时间:2022-02-05 15:47:21
前言
我昨天做了个梦,我梦见我在一条路走,走的时候经过一个房间,里面关着一条边牧和鸡和猪,后来我醒了,我知道那只边牧就是小叶子(哈仔十一的边牧),小叶子具备牧羊和牧鸡的技能,因此,假如我想把一只边牧或者一只狗变成小叶子那样,那么首先就得让其赋予牧鸡的本事,而十一(哈仔十一的哈士奇)则具备卖萌的技能
适配器模式
我们先定义一些代码
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 在牧鸡
可以看到,十一用了小叶子适配器,也具备了牧鸡的功能
那么反过来,叶子变十一呢?那就定义一个十一适配器呗
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 ,拆家啦 !!!!!
看,小叶子具备卖萌的技能了,而且由于拆家是哈士奇的技能,因此小叶子拆家没拆到,实际上,或者卖萌和牧鸡只是哈仔十一(大哈)家的特色,那么是不是可以定义一个大哈家的适配器
/// <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


猜你喜欢
- 1.ArrayList 是基数组结构的,需要连续的内存空间从构造函数可以看出,ArrayList内部用一个Object数组来保存数据。对于无
- 前言面向切面(AOP)Aspect Oriented Programming是一种编程范式,与语言无关,是一种程序设计思想,它也是sprin
- 一、介绍JUnit是一款优秀的开源Java单元测试框架,也是目前使用率最高最流行的测试框架,开发工具Eclipse和IDEA对JUnit都有
- 上一篇,我们已经详细讲解了Android微信支付,今天接着为大家带来支付宝支付,支付宝支付相对微信支付要简单一些,吐槽一下,而且支付宝文档确
- 本文以实例形式介绍了C#中Lambda表达式的用法,分享给大家供大家参考之用。具体如下:从委托的角度来看,Lambda表达式与匿名方法没有区
- Java获取文件的类型和扩展名实现代码:File file=new File("E:\\aa.jpg"); String
- 一)Document介绍API来源:在JDK中javax.xml.*包下使用场景:1、需要知道XML文档所有结构2、需要把文档一些元素排序3
- 两种基本的输入方式1.使用Scanner类需要java.util包构造Scanner类的对象,附属于标准输入流System.in,之后通过其
- 1、概括在博客中,我们将讨论如何让Spring Security OAuth2实现使用JSON Web Tokens。2、Maven 配置首
- 笔记在微服务中,若想要使用远程调用,需要引入spring-cloud-starter-openfeign(在使用注册中心的环境下)<d
- 工作中因业务需求,将数据库中的树状结构的数据根据父节点获取所有的子节点实现思路1.获取整个数据的list集合数据2.将数据分组,java8
- 需要引入命名空间:using System;using System.Text;解码: public static string
- 单线程是安全的,因为线程只有一个,不存在多个线程抢夺同一个资源代码例子:public class SingleThread {int num
- 前言MyBatis中也提供了注解式开发⽅式,采⽤注解可以减少Sql映射⽂件的配置。 当然,使⽤注解式开发的话,sql语句是写在java程序中
- 记得在2013年12月的时候,有系列文章是介绍怎么开发一个智能手表的App,让用户可以在足球比赛中记录停表时间。随着Android Wear
- 首先的效果图搜索到结果(这里我只是模拟数据,真正和服务器走得时候,返回来的数据都应该包含关键字的)模拟的没有搜索结果的界面具体实现在这插一句
- Java服务出现了OOM(Out Of Memory)问题,总结了一些相对通用的方案,希望能帮助到Java技术栈的同学。某Java服务(假设
- 在上文实现的带小圆球的图片滑动的通用性较好,但是较复杂。现在也是利用 ViewPager ,但是却没有利用 ShapeDrawable 来实
- 第一种,在配置文件配置在application.xml直接配置,这种方式是全局配置,所有返回给前端对象的属性为null或"&quo
- Intent应该算是Android * 有的东西。你可以在Intent中指定程序要执行的动作(比如:view,edit,dial),以及程序执