第6章 适配器模式(Adapter Pattern)

简介: 原文 第6章 适配器模式(Adapter Pattern) 概述   将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。  解决的问题   即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

原文 第6章 适配器模式(Adapter Pattern)

概述

  将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

 解决的问题

  即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

注:

       在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式对象适配器模式。由于类适配器模式通过多重继承对一个接口与另一个接口进行匹配,而C#、java等语言都不支持多重继承,因而这里只是介绍对象适配器。

类关系图

举例:

        比如我们目前公司采用一个第三方日记记录的方法,随着版本的更新,第三方已经不提供旧版本的方法,提供了一个新版本的方法,方法名跟类命都不一样了。但是我们又想继续用旧版本的方法,而第三方的源码我们又不能修改,所以我们就可以用一个适配器来解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
     /// <summary>
     /// 旧版本的方法
     /// </summary>
     class  FileWriteLog 
     {
       
         public  void  Write()
         {
             Console.WriteLine( "旧版本写入日记方法" );
         }
     }
     /// <summary>
     /// 新版本
     /// </summary>
     class  NewFileWriteLog
     {
         public  void  NewWrite()
         {
             Console.WriteLine( "新版本的写入日记的方法" );
         }
     }

我们定义一个适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
     /// <summary>
     /// 适配器
     /// </summary>
     class  Adapter 
     {
         private  NewFileWriteLog write =  new  NewFileWriteLog();
         //这里调用新的吸入方法
         public  void  Write()
         {
             write.NewWrite();
         }
     }
     
     //client
     class  Program
     {
         static  void  Main( string [] args)
         {
             Adapter adapter =  new  Adapter();
             adapter.Write();
         }
     }

上面的写法特别的简单,主要是让大家能理解里面的核心,适配器是怎么运作的,就像我们的笔记本适配器一样。

当然在正常的接口定义中肯定也不可能这么的简单,起码第三方的提供的接口,要有一定的重写,继承等功能,这样方便我们调用的时候进行一定的封装,以便后续进行一键修改。

 

我们修改下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
     /// <summary>
     /// 旧版本的方法
     /// </summary>
     class   FileWriteLog 
     {
 
         public  virtual  void  Write()
         {
             Console.WriteLine( "旧版本写入日记方法" );
         }
     }
     
         /// <summary>
     /// 新版本
     /// </summary>
     class  NewFileWriteLog
     {
         public  void  NewWrite()
         {
             Console.WriteLine( "新版本的写入日记的方法" );
         }
     }
 
 
     /// <summary>
     /// 适配器
     /// </summary>
     class  Adapter : FileWriteLog
     {
         private  NewFileWriteLog write =  new  NewFileWriteLog();
         //这里调用新的吸入方法
         public  override  void  Write()
         {
             write.NewWrite();
         }
     }
     
     
     class  Program
     {
         static  void  Main( string [] args)
         {
             FileWriteLog adapter =  new  Adapter();
             adapter.Write();
         }
     }

我们可以用简单工厂对对象的实例化进行封装,这样下次在有改动就需要修改工厂里面的实例化对象即可

1
  FileWriteLog adapter =  new  Adapter();

优点

       通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。

     复用了现存的类,解决了现存类和复用环境要求不一致的问题。

     将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。

     一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

缺点

     在一些场景下更换适配器的实现过程比较的复杂

适用的场景

      系统需要使用现有的类,而这些类的接口不符合系统的接口。

 

     想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

     两个类所做的事情相同或相似,但是具有不同接口的时候。

     旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。

      使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

.net中的适配器模式

 

      Adapter模式在.NET Framework中的一个最大的应用就是COM Interop。COM Interop就好像是COM和.NET之间的一条纽带,一座桥梁。我们知道,COM组件对象与.NET类对象是完全不同的,但为了使COM客户程序象调用COM组件一样调用.NET对象,使.NET程序像使用.NET对象一样使用COM组件,微软在处理方式上采用了Adapter模式,对COM对象进行包装,这个包装类就是RCW(Runtime Callable Wrapper)。RCW实际上是runtime生成的一个.NET类,它包装了COM组件的方法,并内部实现对COM组件的调用。

        .NET中的另一个Adapter模式的应用就是DataAdapterADO.NET为统一的数据访问提供了多个接口和基类,其中最重要的接口之一是IdataAdapter。与之相对应的DataAdpter是一个抽象类,它是ADO.NET与具体数据库操作之间的数据适配器的基类。DataAdpter起到了数据库到DataSet桥接器的作用,使应用程序的数据操作统一到DataSet上,而与具体的数据库类型无关。甚至可以针对特殊的数据源编制自己的DataAdpter,从而使我们的应用程序与这些特殊的数据源相兼容


   设计模式系列文章入口

目录
相关文章
|
弹性计算 负载均衡 网络协议
这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
【2月更文挑战第20天】这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
281 1
|
3月前
|
机器学习/深度学习 存储 Prometheus
机器学习模型监控警报系统设计:Prometheus+Evidently 实战教程
本系统采用Prometheus与Evidently双引擎架构,实现从数据采集、智能分析到精准告警的全流程监控。通过时序数据与模型分析深度集成,支持数据漂移检测、性能评估及根因分析,结合Grafana可视化与Alertmanager智能路由,构建高可用、低延迟的监控体系,显著提升异常检测能力与系统稳定性。
162 1
|
8月前
|
Python
用Pygame Zero 画矩形 (空心、实心、多个矩形、多层同心矩形、彩虹条矩形、条纹相间、随机颜色矩形、特殊效果、渐变效果)
用Pygame Zero 画矩形 (空心、实心、多个矩形、多层同心矩形、彩虹条矩形、条纹相间、随机颜色矩形、特殊效果、渐变效果)
235 40
|
8月前
|
敏捷开发 供应链 搜索推荐
敏捷在汽车行业的应用实践:从理念到落地
在电动化、智能化和个性化趋势推动下,汽车行业正经历深刻变革。敏捷方法成为企业应对快速变化市场的关键。Scrum中文网致力于推广敏捷理念,提供系统化培训和定制化解决方案,帮助企业加速产品迭代、强化跨部门协作、提升决策效率。通过自研工具Leangoo领歌,实现端到端敏捷研发管理,助力企业在变化中抓住机遇,走在行业前沿。
|
8月前
|
存储 人工智能 安全
对话|无影如何助力企业构建办公安全防护体系
阿里云无影助力企业构建办公安全防护体系
|
10月前
|
资源调度 数据中心 网络虚拟化
掌握这9个术语,轻松搞定VXLAN!
【10月更文挑战第27天】
333 3
掌握这9个术语,轻松搞定VXLAN!
|
10月前
|
安全 网络安全 数据安全/隐私保护
Flask框架的安全机制与其他框架相比有哪些优势和劣势?
总的来说,Flask 的安全机制在灵活性和可扩展性方面有其独特优势,但也需要开发者在安全方面投入更多的精力和努力,以确保应用的安全可靠运行。
243 12
|
应用服务中间件 Apache Windows
为什么有的tomcat8的bin目录里的exe有的没有
【6月更文挑战第9天】为什么有的tomcat8的bin目录里的exe有的没有
164 8
|
人工智能 弹性计算 算法
【云故事探索】NO.5:PETKIT小佩,科技与爱,共绘宠物智能生活新篇章
在数字化浪潮中,中国宠物行业蓬勃发展,国内养宠规模已超2亿,形成千亿市场。成立于2013年的PETKIT小佩,专注智能宠物用品,服务遍布40+国家。面对618、双11等高峰挑战,阿里云ECS弹性扩容助其稳定运行。借助阿里云全球化部署能力,小佩成功出海。最新可视喂食器结合AI算法与OSS存储,提升用户体验。未来,双方将进一步探索AI大模型在宠物行业的应用,持续优化养宠体验。
|
弹性计算 供应链 并行计算
阿里云ECS服务器五种计费模式有啥区别?包年包月、按量付费、抢占式实例、节省计划和预留实例券
阿里云服务器计费多样化:包年包月适合长期稳定服务,如Web网站;按量付费适合短期或波动需求,如测试、扩展;抢占式实例享折扣但可能被释放,适合无状态任务;预留实例券抵扣按量付费账单;节省计划提供资源使用承诺的折扣,适用于用量稳定的业务。
447 7