c#中适配器模式详解

这篇具有很好参考价值的文章主要介绍了c#中适配器模式详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基础介绍:

  想象这样一个场景,原项目中接口返回的数据是XML格式的数据,但现在来了一个新客户,它期望接口返回的数据类型为json格式的。

  想要实现要么就是改原有接口,但这样就违反了开闭原则,容易出现未知bug,影响到老客户的正常使用。

  而如果写一个适配器类也就是转换类(第三方类),将原本返回的XML格式数据转换成json格式数据,而具体数据是怎么来的则直接用原有接口方法就可以。

  新客户只需要调用适配器类就可以了,而老客户这边也不会进行任何修改处理。

  如果再有新的客户要求其他类型的返回,只需要在适配器类中增加相应的转换处理就可以了。

  再思考一个问题,现实生活中空调插头一般都是三头的,但如果家里只有两孔插座,那必然是插不进去的。

  以前老的办法那就是把三头插座掰掉一个,另外两个也掰直,这样做存在很大的安全隐患,而且有时并不能工作。

  而如果提供一个拥有三孔插座和两头插头的转换器的话,那空调可以先插在这个转换器上,然后这个转换器再插在插座上就可以了。

  本质并没有变,只是将二孔插座包装了一下,向外界提供了一个三孔插座的外观以供客户使用。

  适配的本质就是转换,将不满足使用条件的东西通过第三方类进行加工处理成可使用的东西。

  适配器模式(Apapter Pattern)是一种结构型设计模式,将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口兼容而不能一起工作的那些类可以一起工作。  

  适配器模式用来解决现有对象与客户端期待接口不一致的问题。

  • 目标角色(Target):描述了其他类与客户端代码合作时必须遵循的协议。
  • 客户角色(Client):与符合Target接口的对象协同。
  • 被适配(服务类,功能类)(Adaptee):定义一个已经存在并已经使用的接口,这个接口需要适配。 客户端与其接口不兼容, 因此无法直接调用其功能。
  • 适配器(Adapter) :适配器模式的核心。适配器接受客户端通过适配器接口发起的调用,同时根据其内在逻辑调用对应服务类。客户端代码只需通过接口与适配器交互即可, 无需与具体的服务类耦合。

优缺点:

  • 单一职责原则:可以将接口或数据转换代码从主要业务逻辑中分离。
  • 开闭原则: 客户端接口只需适配器进行交互, 能在不修改现有代码的情况下在程序中添加新类型的适配器。
  • 通过适配器模式,可以使两个不兼容的接口协同工作,避免了修改现有代码的需要。
  • 提高了代码的复用性和灵活性,因为适配器可以重复使用,并且可以在不同的场景中使用。
  • 降低了系统的耦合度,适配器模式允许系统中的各个组件相互独立地演化。
  • 代码整体复杂度增加 :因为需要新增一系列接口和类。 有时直接更改服务类使其与其他代码兼容会更简单。

应用场景:

  系统需要复用现有类,但是接口又与复用环境要求不一致的情况。

  • 旧系统与新系统的兼容:可以使新系统能够无缝地与老旧系统进行通信
  • 第三方组件的集成:适配器可以将第三方组件的接口转换为符合我们系统需求的接口形式,从而能够顺利地集成到我们的系统中。
  • 多个类库之间的互操作:适配器模式可以起到桥梁的作用

创建方式:

 适配器模式有两种实现结构,对象适配器类适配器。

  试想一下,目前有一个三头插头的空调,需要一个三孔插座,但目前只有一个两孔插座。

  编写一个适配器来包装一下这个两孔插座,让用户可以使用这个空调。

  1. 类适配器

    c#中适配器模式详解c#中适配器模式详解
     1     /// <summary>
     2     /// 两孔插座---被适配者
     3     /// </summary>
     4     public class TwoHoleSocket
     5     {
     6         public void SpecificRequest()
     7         {
     8             Console.WriteLine("两孔插座");
     9         }
    10     }
    11 
    12     /// <summary>
    13     /// 三孔插座---目标角色
    14     /// </summary>
    15     public interface IThreeHoleSocket
    16     {
    17         void Request();
    18     }
    19 
    20     /// <summary>
    21     /// 适配器类提供了三孔插座的外观,但其本质是两孔插座
    22     /// </summary>
    23     public class PowerAdapter : TwoHoleSocket, IThreeHoleSocket
    24     {
    25         public void Request()
    26         {
    27             Console.WriteLine("提供三孔插座的外观");
    28             //执行两孔插座的功能
    29             this.SpecificRequest();
    30         }
    31     }
    32 
    33     /// <summary>
    34     /// 客户端
    35     /// </summary>
    36     class Client
    37     {
    38         static void Main(string[] args)
    39         {
    40             //客户端可以通过适配器来使用这个两孔插座了(因为外观已经是三孔的了)
    41             IThreeHoleSocket threeHoleSocket = new PowerAdapter();
    42             threeHoleSocket.Request();
    43             Console.ReadKey();
    44         }
    45     }
    View Code

    TwoHoleSocket类代表原有的两孔插座,IThreeHoleSocket接口来规范三孔插座的外观。

    PowerAdapter类代表适配器,将两孔插座赋予三孔插座的外观。

    这样用户就可以使用这个适配器来使用这个三头插头的空调了。

    从实例中可以看出,类适配器只要是用继承来实现的,但如果有很多个类进行适配,这个方式就不支持了。

  2. 对象适配器

    c#中适配器模式详解c#中适配器模式详解
     1     /// <summary>
     2     /// 两孔插座---被适配者
     3     /// </summary>
     4     public class TwoHoleSocket
     5     {
     6         public void SpecificRequest()
     7         {
     8             Console.WriteLine("两孔插座");
     9         }
    10     }
    11 
    12     /// <summary>
    13     /// 三孔插座---目标角色
    14     /// </summary>
    15     public class ThreeHoleSocket
    16     {
    17         // 客户端需要的方法
    18         public virtual void Request()
    19         {
    20             //具体实现
    21         }
    22     }
    23 
    24     /// <summary>
    25     /// 适配器类提供了三孔插座的外观,但其本质是两孔插座
    26     /// </summary>
    27     public class PowerAdapter : ThreeHoleSocket
    28     {
    29         //引用两孔插座的实例,从而将客户端与TwoHoleSocket联系起来
    30         public TwoHoleSocket twoHoleSocket = new TwoHoleSocket();
    31         public override void Request()
    32         {
    33             Console.WriteLine("提供三孔插座的外观");
    34             this.Request();
    35             //执行两孔插座的功能
    36             twoHoleSocket.SpecificRequest();
    37         }
    38     }
    39 
    40     /// <summary>
    41     /// 客户端
    42     /// </summary>
    43     class Client
    44     {
    45         static void Main(string[] args)
    46         {
    47             //客户端可以通过适配器来使用这个两孔插座了(因为外观已经是三孔的了)
    48             ThreeHoleSocket threeHoleSocket = new PowerAdapter();
    49             threeHoleSocket.Request();
    50             Console.ReadKey();
    51         }
    52     }
    View Code

    从实例中可以看出,对象适配器其实就是在适配器类中创建了一个被适配者的实例,从而将两者联系在一起。

    这种方式采用 “对象组合”的方式,更符合松耦合。

总结:

  总而言之,适配器就是一个第三方类,将不合时宜的东西转换成符合心意的工具类。

  本质就是转换。

  文章来源地址https://www.toymoban.com/news/detail-745998.html

到了这里,关于c#中适配器模式详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 适配器模式(实例详解)

    Unity中的适配器模式(Adapter Pattern)主要用于将一个类的接口转换为另一个接口,以便于原本不兼容的对象能够协同工作。在Unity中,适配器可以用于多种场景,例如让不同版本API、不同组件间的交互变得一致,或者对接外部库等。由于Unity使用的是C#语言,以下将提供五个简

    2024年01月25日
    浏览(34)
  • Java设计模式之适配器模式详解

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在今天的篇章中,我们将深入探讨Java设计模式的奇妙世界,而焦点就是适配器模式。这种模式就像是代码变换的艺术大师,让不同的接口和类在项目中和谐

    2024年01月19日
    浏览(49)
  • Android基础Adapter适配器详解

    一、概念 Adapter是后端数据和前端显示UI的适配器接口。常见的View如ListView、GridView等需要用到Adapter. BaseAdapter:抽象类,实际开发中继承这个类并且重写相关方法,用得最多的一个Adapter! ArrayAdapter:支持泛型操作,只能展现一行文字,最简单的一个Adapter! SimpleAdapter:同样具有

    2024年02月22日
    浏览(35)
  • 【设计模式——学习笔记】23种设计模式——适配器模式Adapter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    不同国家的插座不同,出国旅游充电器不能直接使用,可以通过使用 多功能转换插头 来辅助使用 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper) 适配器模

    2024年02月16日
    浏览(54)
  • C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现

    介绍完了list类的相关内容后:C++初阶:适合新手的手撕list(模拟实现list) 接下来进入新的篇章,stack和queue的介绍以及模拟: stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器

    2024年02月19日
    浏览(44)
  • 适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?

            关于适配器模式,今天我们主要学习它的两种实现方式,类适配器和对象适配器,以及5种常见的应用场景。同时,我还会通过剖析slf4j日志框架,来给你展示这个模式在真实项目中的应用。除此之外,在文章的最后,我还对代理、桥接、装饰器、适配器,这4种代

    2024年02月13日
    浏览(56)
  • 【C++】STL——容器适配器priority_queue(优先级队列)详解 及 仿函数的介绍和使用

    这篇文章我们接着上一篇的内容,再来学一个STL里的容器适配器—— priority_queue (优先级队列) 1.1 priority_queue的介绍 我们上一篇文章学了 queue (队列),那优先级队列也是在 queue 里面的: 和 queue 一样, priority_queue 也是一个容器适配器,那他和 queue 有什么区别呢?我们一

    2024年02月07日
    浏览(48)
  • 设计模式--适配器模式

    目录 基本介绍 工作原理 类适配模式 介绍 应用实例介绍 类适配器模式注意事项和细节 对象适配模式 介绍 对象适配器模式注意事项和细节 接口适配器模式 介绍 适配器模式的注意事项和细节  (1) 适配器模式(Adapter Pattern) 将某个类的接口转换成客户端期望的另一个接口表示

    2023年04月26日
    浏览(44)
  • 设计模式-适配器模式

    在我们生活中,插座输出的电源都是220V的,而我们手机充电需要的电压基本都是5V的。我们不能直接用220V的电压来给手机充电,也不能说专门有线路来提供5V的电压。所以就有了充电器,充电器可以将220V的电压转为5V的电压,这样我们就方便太多了。 上面所说的充电器其实就

    2024年02月08日
    浏览(47)
  • 设计模式——适配器模式

    说起适配器其实在我们的生活中是非常常见的,比如:学校的宿舍的电压都比较低,而有的学生想使用大功率电器,宿舍的就会跳闸,然而如果你使用一个适配器(变压器)就可以使用了(温馨提示宿舍使用大功率电器不太安全,容易引起火灾,希望大家谨慎使用)。 又比如

    2024年02月12日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包