广告
返回顶部
首页 > 资讯 > 精选 >C#适配器模式与装饰器模式如何实现
  • 902
分享到

C#适配器模式与装饰器模式如何实现

2023-06-30 10:06:00 902人浏览 安东尼
摘要

本篇内容介绍了“C#适配器模式与装饰器模式如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!结构型设计模式创建型设计模式主要是为了解决创

本篇内容介绍了“C#适配器模式与装饰器模式如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

结构型设计模式

创建型设计模式主要是为了解决创建对象的问题,而结构型设计模式则是为了解决已有对象的使用问题。

适配器模式

适配器模式比较好理解,因为在我们的日常生活中就很常见,如耳机转换线、充电器适配器、插座等,举个最常见的例子:

C#适配器模式与装饰器模式如何实现

插座就是个适配器,将一个接口扩展为多个接口,将墙上的双孔接口转换为三孔接口。而这也就是适配器的作用:将一个接口转换为用户期望的另一个接口。

适配器的使用场景:

  • 需要使用第三方SDK的核心功能,但其接口或者功能不符合需求,这时可以使用适配器对其进行兼容和扩展

  • 随着业务发展,旧接口已经不能满足需求,但重写代价又太大,这时可以使用适配器对接口功能进行扩展

注意:适配器是对已有资源进行兼容和扩展,属于一种折中的方式,如果可以的话,尽量重构系统而不是使用适配器

继承器的实现有两种方式:继承组合,基于合成复用的原则,组合优于继承,所以应尽量使用组合的方式实现适配器。类图如下:

C#适配器模式与装饰器模式如何实现

实现代码

//已有的旧接口,不兼容于现在的系统    public interface IAmericanElectrictService    {        int Get110VElectric();    }        //adaptee,需要适配的SDK    public class AmericanElectrictService : IAmericanElectrictService    {        public int Get110VElectric()        {            Console.WriteLine("美国的电压是110v,只能提供110V的电压");            return 110;        }    }        //已有接口,现在的系统需要使用这个接口    public interface IChineseElectricService    {        int Get220VElectric();    }        //适配器,采取组合的方式    //这里是为了适配已有接口,所以实现了这个接口    public class AdapterPattern : IChineseElectricService    {        private readonly IAmericanElectrictService _service;         public AdapterPattern(IAmericanElectrictService service)        {            this._service = service;        }        public int Get220VElectric()        {            var electric = this._service.Get110VElectric();            Console.WriteLine("劈里啪啦劈里啪啦,经过一番操作,现在电压转换为220V的了");            return electric + 110;        }    }        //使用适配器,将110V电压转换成220V    public class AdapterRunner : IRunner    {        public void Run()        {            //实际情况中,adaptee有可能是已有SDK,有可能是interface,通过ioc容器对应具体实现类            var americanElectric = new AmericanElectrictService();            var electric = americanElectric.Get110VElectric();            Console.WriteLine($"获得了{electric}V电压");            Console.WriteLine("使用适配器");            var adapter = new AdapterPattern(americanElectric);            electric = adapter.Get220VElectric();            Console.WriteLine($"使用适配器后获得了{electric}V电压");        }    }    //输出    //------------------------------------    //美国的电压是110v,只能提供110V的电压    //获得了110V电压    //使用适配器    //美国的电压是110v,只能提供110V的电压    //劈里啪啦劈里啪啦,经过一番操作,现在电压转换为220V的了    //使用适配器后获得了220V电压

总结

优点:

  • 可以扩展和兼容现有类,灵活性高

  • 提高了类的复用,原本不能使用的类适配后能使用

缺点:

  • 适配器本质是套一层,如果使用过多,可能导致系统混乱,甚至出现套中套的复杂情况

装饰器模式

利用继承和组合,在不改变现有结构的情况下对功能进行扩展的模式称为装饰器模式

装饰器模式和适配器模式很像,但侧重点不一样。适配器的重心在于兼容已有系统,而装饰器的重心在于功能扩展。装饰器的类图如下:

C#适配器模式与装饰器模式如何实现

上图中,基础装饰器继承抽象类,每个装饰器继承前一个装饰器,一步一步添加功能,并且所有装饰器都用到具体实现类,因为需要扩展具体功能。

这里其实就能看出一些装饰器和适配器的区别,适配器和装饰器都使用组合来包装已有类,不同的是装饰器用到了继承。装饰器的核心原则是里氏替换原则,即父类一定能被子类替换而不影响现有代码。

实现代码

//抽象基础类public abstract class AbstractStudent{    public abstract void Study();} //具体实现类public class Student : AbstractStudent{    public override void Study()    {        Console.WriteLine("我正在学习!!!");    }} //基础装饰器,什么也不做//注意,这里标记为抽象类,此后的装饰器以此为基础public abstract class BaseDecorator : AbstractStudent{    private readonly AbstractStudent _student;    public BaseDecorator(AbstractStudent student)    {        this._student = student;    }    //这里使用override还是Virtual取决于AbstractStudent基础类是抽象类还是接口    public override void Study()    {        this._student.Study();    }} //前缀装饰器,在调用具体功能前做点什么 public class PreDecorator : BaseDecorator{    public PreDecorator(AbstractStudent student) : base(student)    {    }    public override void Study()    {        Console.WriteLine("学习前看会儿小说");        base.Study();    }} //后缀装饰器,在调用具体功能后做点什么public class NextDecorator : PreDecorator{    public NextDecorator(AbstractStudent student) : base(student)    {    }    public override void Study()    {        base.Study();        Console.WriteLine("学习辛苦啦,奖励自己一包辣条");    }} //测试代码public class DecoratorRunner : IRunner{    public void Run()    {        Console.WriteLine("没有用装饰器的基本功能:");        var student = new Student();        student.Study();        Console.WriteLine();                Console.WriteLine("使用前缀装饰器在基础功能之前做点什么");        var preDecorator = new PreDecorator(student);        preDecorator.Study();        Console.WriteLine();                Console.WriteLine("使用后缀装饰器在前缀装饰器功能之后做点什么");        //注意:这里传入的前缀装饰器,在前缀装饰器的基础之上做扩展        var nextDecorator = new NextDecorator(student);        nextDecorator.Study();    }} //输出:  //没有用装饰器的基本功能://我正在学习!!!////使用前缀装饰器在基础功能之前做点什么//学习前看会儿小说//我正在学习!!!////使用后缀装饰器在前缀装饰器功能之后做点什么//学习前看会儿小说//我正在学习!!!//学习辛苦啦,奖励自己一包辣条

可以看出,装饰器其实就是利用组合+继承(实现)+override不断包装和更新对象,使其功能得到扩展。装饰器是用于替换继承的设计模式,主要使用场景如下:

  • 想扩展实现类的功能,又不想添加太多子类

  • 需要动态增加和撤销功能(例如游戏技能)

装饰器的优点在于灵活,耦合性低,且不会改变现有结构。缺点则是嵌套过多会增加系统复杂度。

“C#适配器模式与装饰器模式如何实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C#适配器模式与装饰器模式如何实现

本文链接: https://www.lsjlt.com/news/328329.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#适配器模式与装饰器模式如何实现
    本篇内容介绍了“C#适配器模式与装饰器模式如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!结构型设计模式创建型设计模式主要是为了解决创...
    99+
    2023-06-30
  • C#设计模式之适配器模式与装饰器模式的实现
    目录结构型设计模式适配器模式实现代码总结装饰器模式实现代码结构型设计模式 创建型设计模式主要是为了解决创建对象的问题,而结构型设计模式则是为了解决已有对象的使用问题。 适配器模式 适...
    99+
    2022-11-13
  • C#实现装饰器模式
    场景:假设每次我们去超市购物,我们都会推一个购物车,有水果、蔬菜、肉类三种商品,提供给我们选择,那么这时候,如果使用装饰器模式,应该如何实现? 1.什么是装饰器模式 首先我们知道,如...
    99+
    2022-11-13
  • NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
    本文实例讲述了NodeJS设计模式。分享给大家供大家参考,具体如下: 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直接返回,若不存在,则创建实例对...
    99+
    2022-06-04
    模式 观察者 适配器
  • C#设计模式之装饰器模式实例详解
    最近踢了场球,9人制比赛,上半场我们采用防守阵型效果不佳,下半场采用进攻阵型取得了比赛的主动。我们上下半场所采取的策略,似乎可以用"装饰器"模式实现一遍。 首先肯...
    99+
    2022-11-13
  • java如何实现适配器模式
    这篇文章将为大家详细讲解有关java如何实现适配器模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。适配器(Adapter)模式:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不...
    99+
    2023-05-31
    java
  • C++实现设计模式之装饰者模式详解
    目录设计模式和设计原则装饰者模式中的类案列描述代码实现总结设计模式和设计原则 装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者模式提供了比继承更有弹性的替代方案。 装饰者模式...
    99+
    2022-11-12
  • C#适配器模式的使用
    目录前言适配器模式前言 我昨天做了个梦,我梦见我在一条路走,走的时候经过一个房间,里面关着一条边牧和鸡和猪,后来我醒了,我知道那只边牧就是小叶子(哈仔十一的边牧),小叶子具备牧羊和牧...
    99+
    2022-11-13
  • python设计模式之装饰器模式怎么实现
    今天小编给大家分享一下python设计模式之装饰器模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。装饰器模式装饰器...
    99+
    2023-06-30
  • Java设计模式的装饰器模式怎么实现
    本文小编为大家详细介绍“Java设计模式的装饰器模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式的装饰器模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是装饰器模式装饰器...
    99+
    2023-06-30
  • JavaScript设计模式适配器模式实例
    前言: 适配器设计模式可以用生活中常用的笔记本电脑来做例子,笔记本使用电压在20v左右,但是我们家用电压在220v左右,所以我们希望用家用电适配对应的笔记本电压,这个时候就需要使用电...
    99+
    2022-11-13
  • C#如何解析适配器设计模式
    这篇文章将为大家详细讲解有关C#如何解析适配器设计模式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。今天看到一个园子里的朋友写了一篇ASP.NET的适配器设计模式的文章。其中提到了把输入的电...
    99+
    2023-06-17
  • PHP结构型模式之装饰器模式怎么实现
    今天小编给大家分享一下PHP结构型模式之装饰器模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。装饰器模式(Deco...
    99+
    2023-07-05
  • Java设计模式的适配器模式怎么实现
    这篇文章主要介绍“Java设计模式的适配器模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java设计模式的适配器模式怎么实现”文章能帮助大家解决问题。什么是适配器模式适配器模式(Adap...
    99+
    2023-06-30
  • java适配器模式怎么实现
    适配器模式是一种结构型设计模式,用于将一个类的接口转换为另一个接口,以便兼容不同的类或系统。在Java中,适配器模式可以通过以下步骤...
    99+
    2023-10-23
    java
  • 使用go实现适配器模式
    目录适配器模式定义代码实现优点缺点适用范围参考适配器模式 定义 适配器模式的英文翻译是Adapter Design Pattern。顾名思义,这个模式就是用来做适配的,它将不兼容的接...
    99+
    2022-11-12
  • java如何实现装饰者模式
    这篇文章主要介绍java如何实现装饰者模式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!定义:    在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能。 &...
    99+
    2023-05-30
    java
  • laravel装饰者模式如何实现
    在 Laravel 中,可以通过使用中间件来实现装饰者模式。装饰者模式是一种结构型设计模式,它允许向现有对象动态地添加新的功能,同时...
    99+
    2023-09-29
    laravel
  • 如何使用Python装饰器实现单例模式
    这篇文章主要为大家展示了“如何使用Python装饰器实现单例模式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Python装饰器实现单例模式”这篇文章吧。装饰器实现:def w...
    99+
    2023-06-17
  • Java中怎么实现适配器模式
    本篇文章为大家展示了Java中怎么实现适配器模式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。类适配模式在地球时代,所有坐骑都是只能跑,不能飞的,而现在很多坐骑在地球都可以飞了。假设,地球时代的坐骑...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作