设计模式之适配器

适配器模式介绍

介绍

适配器模式的作用就是把原本不兼容的接口,通过适配修改到统一的过程,使得用户方便使用。

在实际工作中, 有时候我们需要把各个业务线的各种类型服务做统一的包装,再对外提供接口进行使用。

适配器模式要解决的主要问题就是多种差异化类型的接口做统一输出。

适配器可担任两个对象间的封装器,它会接收对于一个对象的调用,并将其转换为另一个对象可识别的格式和接口。

适配器模式通过封装对象将复杂的转换过程隐藏于幕后。被封装的对象甚至察觉不到适配器的存在。

适配器模式结构

  • 对象适配器

构成原则:适配器实现其中一个对象的接口,并对另一个对象进行封装。

1、客户端:包含当前程序业务逻辑的类。

2、客户端接口:描述了其他类与客户端代码合作时必须遵循的协议。

3、服务:其中的有些功能类或方法,客户端无法直接调用其功能,无法进行使用。

4、适配器:可以同时与客户端和服务交互的类,它在实现客户端接口的同时封装了服务对象。适配器接受客户端通过适配器接口发起的调用,并将其转换为适用于被封装服务对象的调用。

客户端代码只需通过接口与适配器交互即可,无需与具体的适配器耦合。这在服务类接口被更改或替换时很有用,你无需修改客户端代码就可以创建新的适配器类。

  • 类适配器

通过继承机制,适配器同时继承两个对象的接口。此种方式只在支持多重继承的编程语言中实现,例如C++

类适配器不需要封装任何对象,因为它同时继承了客户端和服务的行为。适配功能在重写的方法中完成,最好生成的适配器可替代已有的客户端类进行使用。

适配器模式优缺点

优点:

  • 使得代码干净整洁,易于维护,减少大量重复的判断和使用,让代码更加易于维护和扩展。

  • 单一职责原则,可以将接口或数据转换代码从程序主要业务逻辑中分离。

  • 开闭原则,客户端代码通过客户端接口与适配器进行交互,你就能在不修改现有客户端代码的情况下在程序中添加新类型的适配器。

缺点:

  • 代码复杂度增加,需要增加很多接口和类

Demo

    /// <summary>/// 接口类,客户端类/// </summary>public interface ITarget{string GetRequest();}
    /// <summary>/// 被适配者     例如遗留老代码,开源模块等/// </summary>public class Adaptee{public string GetSpecificRequest() {return "特殊的请求  遗留的老代码";}}
    /// <summary>/// 适配器/// </summary>public class Adapter:ITarget{private readonly Adaptee _adaptee;public Adapter(Adaptee adaptee){this._adaptee = adaptee;}/// <summary>/// 显示实现的接口类/// 在这里可以调用遗留老代码的方法。/// </summary>/// <returns></returns>public string GetRequest(){return "我正在调用:" + _adaptee.GetSpecificRequest();}}
    class Program{static void Main(string[] args){Console.WriteLine("Start Test Adapter Mode");//实例化老代码模块Adaptee tempAdaptee = new Adaptee();                            ITarget adapter = new Adapter(tempAdaptee);//通过实现的接口去调用老代码模块中的方法。var showResult=adapter.GetRequest();            Console.WriteLine(showResult);Console.ReadKey();}}
被调用老代码模块的方法

可以看到在上述代码中,我们通过适配器去直接调用的老代码中的方法。在我们平时的开发过程中,适配器使用的场景还是很多的,比如系统对开源组件的支持,多设备的支持等。对于设计模式而言,要学会注意它的使用场景,也只有在合适的场景下使用它,才能发挥它最大的效果。

适配器可以通过以不同抽象或接口实例为参数的构造函数来识别。当适配器的任何方法被调用时,它会将参数转换为合适的格式,然后将调用定向到其封装对象中的一个或多个方法。

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发  谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle9i卸载后再次安装,设置的SID相同出现“指定的SID在本机上已经存在。请指定一个不同的SID。”...

Oracle9.0.2卸载后再次安装&#xff0c;设置的SID相同出现“指定的SID在本机上已经存在。请指定一个不同的SID。” 记得阿都跟我说过要全部清除注册表。 但是考虑到出现相同的SID&#xff0c;类似于安装mssql时出现相同实例&#xff0c;我认为删除SID相关的注册表信息&#xff…

qsort(bsearch,lsearch)—标准库排序,查找

2019独角兽企业重金招聘Python工程师标准>>> //对字符串排序 #include<iostream> #include<cstdlib> #include<string.h> #define N 8 using namespace std; int compare(const void *a,const void *b); int main(void) {int i;char s[8][10] {&q…

三分钟教会你Java while循环中嵌套if

##[java的三种循环结构与循环嵌套] 循环结构&#xff1a; 语法&#xff0c;及执行顺序 语法&#xff1a; while(boolean类型){//功能语句}执行顺序&#xff1a; 1[断小括号中的值是否为true&#xff0c;如果为true&#xff0c;执行功能语句] 2[行完功能语句&#xff0c;继…

深入浅出理解索引结构

&#xff08;一&#xff09;深入浅出理解索引结构 实际上&#xff0c;您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引&#xff1a;聚集索引&#xff08;clustered index&#xff0c;也称聚类索引、簇集索引&#xff09;和非聚集索引&#xff08;noncluster…

中科大博士写外挂被抓,非法牟利300多万!

全世界只有3.14 %的人关注了青少年数学之旅近日&#xff0c;扬州警方破获一起中科大博士伙同他人在网上销售外挂软件非法牟利超过 300 万的案件。2016年6月&#xff0c;北京某游戏公司发现网上有款名为“冰焰”的外挂软件大量销售&#xff0c;给他们的网游造成了巨大损失这款外…

C# WPF MVVM项目实战(进阶②)

这篇文章还是在之前用Caliburn.Micro搭建好的框架上继续做的开发&#xff0c;今天主要是增加了一个用户窗体ImageProcessView&#xff0c;然后通过Treeview切换选择项之后在界面显示不同效果的图片。01—重要的知识点本篇内容基于CM框架编写&#xff0c;涉及以下知识点&#xf…

浏览器要是能这么做就好了

原文地址&#xff1a;http://www.laaan.cn/?p994 之前和搜狗浏览器的开发团队做过一些合作。主要是用户教育方便的事。需要他们给我开几个接口&#xff0c;让flash与浏览器通讯。都是很谨慎的。不过后来想一想&#xff0c;要是搜狗浏览器能开放一些接口供js或flash调用该有多好…

64位的Linux中运行32位的应用程序

安装32位的支持库因为x86_64处理器是为x86技术涉及&#xff0c;所以它也是支持32位程序的。在Linux里&#xff0c;你所需要做的就是为这些软件安装必要的软件库。幸运的是&#xff0c;大部分Linux发行版本已经将这些打包好了。比方在Ubuntu里&#xff0c;这个包就叫做ia32-libs…

腾讯架构师讲解Java接口的继承与抽象类

在实施接口中&#xff0c;我们利用interface语法&#xff0c;将interface从类定义中独立出来&#xff0c;构成一个主体。interface为类提供了接口规范。 在继承中&#xff0c;我们为了提高程序的可复用性&#xff0c;引入的继承机制。当时的继承是基于类的。interface接口同样可…

说说大型高并发高负载网站的系统架构

By Michael 转载请保留出处&#xff1a;俊麟 Michael’s blog (http://www.toplee.com/blog/?p71) Trackback Url : http://www.toplee.com/blog/wp-trackback.php?p71 我在CERNET做过拨号接入平台的搭建&#xff0c;而后在Yahoo&3721从事过搜索引擎前端开发&#xff0c;…

数据库优化的几种方式

数据库的优化有很多方式&#xff0c;下面介绍一下数据库的优化方式。1、选取最适用的字段属性。MySQL可以支持大数据量的存取&#xff0c;但是数据库中的表越小&#xff0c;在上面执行的查询就越快。所以可以将表中的字段宽度设置的尽可能小。2、使用连接来代替子查询&#xff…

删除windows7中的“兼容性疑难解答”右键菜单

windows7中的exe文件右键菜单中有一个“兼容性疑难解答”项&#xff0c;可以检测exe兼容性问题&#xff0c;但对于我们来说一般没有什么用处&#xff0c;检测到问题也不是我们用户能解决的&#xff0c;反而把右键菜单变长了。删除它的方式如下&#xff1a; 把如下文件保存为一个…

java基础之java输入输出语句

1、使用Scanner 使用时需要引入包importjava.util.Scanner;首先定义Scanner对象 Java基础学习&#xff1a;java输入输出语句 比如&#xff1a; Java基础学习&#xff1a;java输入输出语句 2、使用BufferedReader 用前需要引入importjava.io.Reader; Java基础学习&#xff1…

自制WiFiPineapple

什么是WiFiPineapple&#xff1f;关于这个问题&#xff0c;相信各位心里都有自己的答案&#xff0c;这里引用下radiowar的介绍&#xff1a;自从2008开始&#xff0c;WiFi PineApple成为了最受欢迎的安全测试设备&#xff0c;在开源无线安全审计软件社区的支持&#xff0c;WiFiP…

全世界的狗都没有“生殖隔离” | 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅动物界的“一拳超人”雀尾螳螂虾它有一双力大无比的铁拳出拳速度在五十分之一秒内最大速度可达80km/h产生约60kg的冲击力威力足以匹敌小口径手枪子弹&#xff08;图源冷知君&#xff0c;侵权删&#xff09;如何把清水一秒变可乐&…

聊聊Go的三色标记法

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「203」篇原创敬上大家好&#xff0c;我是 Z 哥。今天带来一篇久违的技术型文章。之前也有不少小伙伴会问&#xff0c;Z 哥你好久没发技术性文章了。其实主要原因有…

asp.net 日期转换

Sql Server中的日期与时间函数 1. 当前系统日期、时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上&#xff0c;返回新的 datetime 值 例如&#xff1a;向日期加上2天 select dateadd(day,2,2004-10-15) --返回&#xff1a;2004-10-17 00:…

12种方法返回2个文件路径之间的公共基路径ExtractBasePath

方法一:Boris Kumpar function ExtractBasePath(const Path1,Path2:string):string; const PATH_DELIMITER \; DRIVE_DELIMITER :; var P1,P2:PChar; cnt,j:Integer; begin P1:PChar(Path1) ; P2:PChar(Path2) ; cnt : 1; j : 0; {$B-} while (P1^ <>…

架构师讲解Java中websocket的应用

这篇文章主要来介绍一下在java项目中&#xff0c;特别是java web项目中websocket的应用。 场景&#xff1a;我做了一个商城系统&#xff0c;跟大多数商城系统&#xff0c;分为客户端和后台&#xff0c;客户端供客户浏览&#xff0c;下单&#xff0c;购买&#xff0c;后台主要管…

CocoStudio游戏发布后资源加密大致实现思路

截止到目前&#xff0c;CocoStudio版本已经发展到1.3.0.1&#xff0c;各个子工具间也已经发生了巨大变化。但是&#xff0c;无论是动画编辑器&#xff0c;UI编辑器&#xff0c;场景编辑器还是数据编辑器&#xff0c;它们生成&#xff08;导出&#xff09;的文件在商业开发中往往…