首页 > 编程语言 >c#代码介绍23种设计模式_07适配器模式

c#代码介绍23种设计模式_07适配器模式

时间:2024-09-23 21:51:31浏览次数:3  
标签:07 TwoHole 对象 适配器 模式 NET 设计模式 public

目录

1、适配器模式

2、类的适配器模式实现(ClassAdapterPattern.cs)

3、对象的适配器模式实现(ObjectAdapterPattern.cs)

4、适配器模式的优缺点

4-1. 类的适配器模式:

4-2. 对象的适配器模式

5、使用场景

6、.NET中适配器模式的实现

7、实现思路


1、适配器模式

在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象。
那么如果将“将现存的对象”在新的环境中进行调用呢?解决这个问题的办法就是我们本文要介绍的适配器模式——使得新环境中不需要去重复实现已经存在了的实现而很好地把现有对象(指原来环境中的现有对象)加入到新环境来使用。

2、类的适配器模式实现(ClassAdapterPattern.cs)

具体场景是: 在生活中,我们买的电器插头是2个孔的,但是我们买的插座只有三个孔的,此时我们就希望电器的插头可以转换为三个孔的就好,这样我们就可以直接把它插在插座上,
此时三个孔插头就是客户端期待的另一种接口,自然两个孔的插头就是现有的接口,适配器模式就是用来完成这种转换的

期待的内容(3个孔)做成接口,增加方法=>适配类继承元内容(2孔)和接口(3孔)=>实现接口的方法,其中调用2孔的方法

因为适配器(PowerAdapter类)与源角色(TwoHole类)是继承关系,所以该适配器模式是类的适配器模式

3、对象的适配器模式实现(ObjectAdapterPattern.cs)

适配器模式还有另外一种形式——对象的适配器模式,这里就具体讲解下它的实现,实现的分析思路:既然现在适配器类不能继承TwoHole抽象类了(因为用继承就属于类的适配器了),但是适配器类无论如何都要实现客户端期待的方法的,即Request方法,
所以一定是要继承ThreeHole抽象类或IThreeHole接口的,然而适配器类的Request方法又必须调用TwoHole的SpecificRequest方法,又不能用继承,这时候就想,不能继承,但是我们可以在适配器类中创建TwoHole对象,然后在Requst中使用TwoHole的方法了

4、适配器模式的优缺点

4-1. 类的适配器模式:

优点
1)可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”
2)可以重新定义Adaptee(被适配的类)的部分行为,因为在类适配器模式中,Adapter是Adaptee的子类
3)仅仅引入一个对象,并不需要额外的字段来引用Adaptee实例(这个即是优点也是缺点)。
缺点:
1)用一个具体的Adapter类对Adaptee和Target进行匹配,当如果想要匹配一个类以及所有它的子类时,类的适配器模式就不能胜任了。
   因为类的适配器模式中没有引入Adaptee的实例,光调用this.SpecificRequest方法并不能去调用它对应子类的SpecificRequest方法。
2)采用了 “多继承”的实现方式,带来了不良的高耦合。

4-2. 对象的适配器模式

优点:
1)可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”(这点是两种实现方式都具有的)
2)采用 “对象组合”的方式,更符合松耦合。
缺点:
使得重定义Adaptee的行为较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。

5、使用场景

在以下情况下可以考虑使用适配器模式:
1)系统需要复用现有类,而该类的接口不符合系统的需求
2)想要建立一个可重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3)对于对象适配器模式,在设计里需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

6、.NET中适配器模式的实现

1)适配器模式在.NET Framework中的一个最大的应用就是COM Interop。COM Interop就好像是COM和.NET之间的一座桥梁。COM组件对象与.NET类对象是完全不同的,但为了使.NET程序
   象使用.NET对象一样使用COM组件,微软在处理方式上采用了Adapter模式,对COM对象进行包装,这个包装类就是RCW(Runtime Callable Wrapper)。RCW实际上是runtime生成的一个.NET类,它包装了COM组件的方法,并内部实现对COM组件的调用
2).NET中的另外一个适配器模式的应用就是DataAdapter。ADO.NET为统一的数据访问提供了多个接口和基类,其中最重要的接口之一是IdataAdapter。DataAdpter起到了数据库到DataSet桥接器的作用,使应用程序的数据操作统一到DataSet上,而与具体的数据库类型无关。甚至可以针对特殊的数据源编制自己的DataAdpter,从而使我们的应用程序与这些特殊的数据源相兼容。

7、实现思路

个人理解:
1、类的适配器(两项的电器插头可以插入到三项的插排)
  1)创建一个接口IThreeHole
        public interface IThreeHole
           -> void Request();

  2)创建两项插头的类TwoHole
        public class TwoHole
           -> public void SpecificRequest()

  3)创建适配器类PowerAdapter,继承TwoHole,实现IThreeHole接口
        public class PowerAdapter : TwoHole, IThreeHole
           -> void Request()
                -> this.SpecificRequest();  // 调用两个孔插头方法

  4)客户端的调用
     IThreeHole threeHole = new PowerAdapter();
     threeHole.Request();

2、对象的适配器模式
  1)创建目标对象即三个插头
     public class ThreeHoleObject
           -> public virtual void Request()

  2)创建源角色——需要适配的类
     public class TwoHoleObject
           -> public void SpecificRequest()

  3)创建适配器类PowerAdapterObject,继承ThreeHoleObject
     public class PowerAdapterObject : ThreeHoleObject
           -> public TwoHoleObject twoHole = new TwoHoleObject();
              public override void Request()
                    -> twoHole.SpecificRequest();

  4)客户端调用
     ThreeHoleObject threeHoleObject = new PowerAdapterObject();
     threeHoleObject.Request();

✳详细的代码实现,请点击资源绑定

标签:07,TwoHole,对象,适配器,模式,NET,设计模式,public
From: https://blog.csdn.net/soarfeng/article/details/142469636

相关文章

  • P1094 [NOIP2007 普及组] 纪念品分组
    [NOIP2007普及组]纪念品分组题目背景NOIP2007普及组T2题目描述元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能......
  • 云设计模式介绍
    云设计模式介绍以及它们如何帮助应对分布式计算的谬误   作为构建分布式系统的软件工程师,我们经常遇到诸如不可靠的网络、延迟问题和安全问题等挑战。"分布式计算的谬误"描述了如果未解决,可能导致系统故障的常见误解。但认识到这些陷阱只是开始。真正的问题是:我们如何有效地克......
  • ELEC5307 Deep Learning
    ELEC5307DeepLearningProject#1:ParametersinNeuralNetworksDue:23Oct202011:59PM1ObjectivesThislaboratoryaimstointroducethebasictechniquesindeepneuralnetworks.Inthislaboratoryyouwill:LearntousePyTorchtoloadimagesand......
  • 进程已结束,退出代码为 -1073740791 (0xC0000409)。QThread: Destroyed while thread i
            在使用pycharm写代码发现代码运行不了,进程已结束,退出代码为-1073740791(0xC0000409),但是又不提示具体错在哪。为了得到更加清晰的错误原因,可如下操作:        ①点击debug旁边的三个小点moreactions,点击编辑。        ②勾选在控制台中......
  • 【日记】夏天,已经结束了呢(1072 字)
    正文跟灵分别后,我在椅子上发了很久的呆。可能有五分钟吧。就这样感受着微风吹过身体,听着身边熙熙攘攘的声音。我不知道为什么要发呆。自然而然就这样做了。过了很久,我意识到可能必须要吃饭了,才起身找饭馆。今天情绪不太好。我不知道是不是因为没睡够。不过,并......
  • 英特尔®以太网网络适配器E810-CQDA1 / E810-CQDA2 网卡 规格书 e810 网卡 规格书 Int
    英特尔®以太网800系列网络适配器英特尔®以太网网络适配器E810-CQDA1/CQDA2在10到100Gbps的以太网速度下实现高效的工作负载优化性能关键特性•单、双端口QSFP28•应用设备队列(ADQ)•PCIExpress(PCIe)4.0x16•动态设备个性化(DDP)•以太网端口配置工具(EPCT)......
  • Qt C++设计模式->组合模式
    组合模式(CompositePattern)是一种结构型设计模式,允许你将对象组合成树形结构以表示部分与整体的层次关系。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,简化了对复杂树形结构的操作。组合模式的应用场景组合模式非常适合用于需要处理树形结构的场景,比如文件系......
  • Navicat中一些查找操作 笔记07
    一、单表查询1.查找所有(*)slect*fromst01  【注:以下操作代码中的st01是表格名字】 2.where子语句中的一些运算符--=等于-->大于-->=大于等于--<小于--<=小于等于--!=不等于select*fromst01whereage=21select*fromst01whereage>18select*fro......
  • windows10事件代码1074自动重启进程 C:\WINDOWS\system32\svchost.exe用户 NT AUTH
    PSC:\WINDOWS\system32>Get-Eventlog-LogNameSystem-Source"User32"-Newest1|Where-Object{$_.EventID-eq1074}|fl*EventID:1074MachineName:DESKTOP-4COHMG5Data:{}Index:5515......
  • BZOJ 4932 = BZOJ 9434 = LOJ 6070 基因
    Statement问区间本质不同回文串数,强制在线,\(n\le10^5\).其实还有个四倍经验:BZOJ5384.Solution1考虑一个结论:\(s\)的所有回文后缀按长度排序后,可以划分为\(O(\log|s|)\)段等差数列。考虑离线怎么做:移动右端点\(i\),新增一个串\(s\),设其上一次出现的起点为\(q\),则\([q+......