Adapter(适配器)--类对象结构型模式

Adapter(适配器)–类对象结构型模式

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

二、动机
1.在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。
2.如果应对这种“迁移的变化”?如何能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?

三、适用性
1.你想使用一个已经存在的类,而它的接口不符合你的需求。
2.你想创建一个可以复用的类,该类可以与其他不相关的类或者不可见的类(即那些接口可能不一定兼容的类)协同工作。
3.(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每个一都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

四、结构
类适配器使用多重继承对一个接口与另一个接口进行匹配,入下图所示。
在这里插入图片描述

对象匹配器依赖对象组合,如下图所示。
在这里插入图片描述

五、效果
类适配器和对象适配器有不同的权衡。类适配器
1.用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类似及所有它的子类时,类Adaptee将不能胜任工作。
2.使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
3.仅引入了一个对象,并不需要额外的指针以间接得到adaptee。
对象适配器则
1.允许一个Adapter与多个Adpatee——即Adaptee本身以及它的所有子类(如果有子类的话)——同时工作。Adapter也可以一次给所有的Adpatee添加功能。
2.使得重定义Adaptee的行为比较困难。这就是需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。

六、实现
1.使用C++实现适配器类
2.可插入的适配器

七、要点总结
1.Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一样的情况”,在遗留代码复用、类库迁移等方面非常有用。
2.类适配器采用“多继承”的实现方式,一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
3.Adapter模式可以实现的非常灵活,不必拘泥于定义中的两个结构(类模式、对象模式)。

八、相关模式
模式Bridge的结构与对象适配器类似,但是Bridge模式的出发点不同:Birdge目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而Adpater则意味着改变一个已有对象的接口。
Decorator模式增强了其他对象的功能而同时又不改变它的接口。因此decorator对应程序的透明性比适配器要好。结果是decorator支撑递归组合,而纯粹使用适配器是不可能实现这一点的。
模式Proxy在不改变它的接口条件下,为另一个对象定一个了一个代理。

九、举例说明
适配器模式相当于现实中的转接头。就是为适配接口而产生的。

本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解

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

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

相关文章

如何使用ABP框架(2)三层架构与领域驱动设计的对比

本文来自长沙.NET技术社区,原创:邹溪源。全文共有8500字,读完需耗时10分钟。题图来自pixabay简述上一篇简述了ABP框架中的一些基础理论,包括ABP前后端项目的分层结构,以及后端项目中涉及到的知识点,例如DTO…

Bridge(桥接)--对象结构模式

Bridge(桥接)–对象结构模式 一、意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化。 二、动机 1.由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。 2.如何应对这种“多维度…

Composite(组合)--对象结构型模式

Composite(组合)–对象结构型模式 一、意图 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 二、动机 1.软件在某些情况下,客户代码过多的依赖于对象容器复杂的内部实现结构…

[SpringBoot2]ajax函数中data参数的数据设置方式

ajax函数中data参数的数据设置方式:

Blazor带我重玩前端(二)

概览Blazor目前有两种托管模式,一种是Server-Side模式,一种是WebAssembly模式。官方首先支持的是Service-Side模式,使用WebAssembly模式,需要更新到最新版VS2019。小编目前的精力是更多的专注于Blazor-WebAssembly模式的研究&…

Decorator(装饰)--对象结构型模式

Decorator(装饰)–对象结构型模式 一、意图 1.动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 二、动机 1.在某些情况下我们可能会“过度地使用继承来扩展对象的功能”, 由于继承为类…

Facade(外观)--对象结构型模式

Facade(外观)–对象结构型模式 一、意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 二、动机 1.上述左边方案的问题在于组件的客户和组件中各种复杂的子系…

.NET Core微服务开发网篇-ocelot

通过上篇我们知道,网关是外部访问的统一入口,本文采用Ocelot作为Api网关。环境要求:vs2019.NetCore3.1Ocelot16.0.1创建一个产品服务Api站点(AAStore.ProductCatalog.Api)添加一个ProductController[Route("api/[…

Flyweight(享元)--对象结构型模式

Flyweight(享元)–对象结构型模式 一、意图 运行共享技术有效地支持大量细粒度的对象。 二、动机 1.在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。 2.…

IBM 声明对 Google 违背承诺未将 Istio 贡献给 CNCF 表示失望

Jason R McGee,IBM 院士,IBM 云平台副总裁兼 CTO。昨天晚上Google 宣布将 Istio 商标转让给 Open Usage Commons 组织,IBM 当即在 IBM Developer 网站上发表声明对 Google 的做法表示失望。以下为 IBM 云平台副总裁兼 CTO Jason R McGee 的声…

[mybatis]Configuration XML_properties

properties mybatis可以使用properties来引入外部properties配置文件的内容 resource:引入类路径下的资源 url:引入网络路径或者磁盘路径下的资源 process 项目结构: mybatis-config.xml: <?xml version"1.0" encoding"UTF-8" ?> <!DOCTY…

Proxy(代理)--对象结构型模式

Proxy&#xff08;代理&#xff09;–对象结构型模式 一、意图 为其他对象提供一种代理以控制对这个对象的访问。 二、动机 1.在面向对象系统中&#xff0c;有些对象由于某种原因&#xff08;比如对象创建的开销很大&#xff0c;或者某些操作需要安全控制&#xff0c;或者需要…

浅谈.Net Core DependencyInjection源码探究

前言对于IOC和DI&#xff0c;可能每个人都能说出自己的理解。IOC全称是Inversion of Control翻译成中文叫控制反转&#xff0c;简单的说就是把对象的控制权反转到IOC容器中&#xff0c;由IOC管理其生命周期。DI全称是DependencyInjection翻译成中文叫依赖注入&#xff0c;就是I…

[mybatis]Configuration XML_settings

settings settings包含很多重要的设置项 setting:用来设置每一个设置项name:设置项名value:设置项取值 mapUnderscoreToCamelCase 开启驼峰命名法 <settings><setting name"mapUnderscoreToCamelCase" value"true"/></settings>Emplo…

Chain of responsibility(职责链)--对象行为型模式

Chain of responsibility&#xff08;职责链&#xff09;–对象行为型模式 一、意图 使多个对象有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 二…

[mybatis]Configuration XML_typeAliases and Alias

There are many built-in type aliases for common Java types. They are all case insensitive, note the special handling of primitives due to the overloaded names. typeAliases typeAlias:为某个java类型起别名 type:指定要起别名的类型全类名;默认别名就是类名小写;em…

Command(命令)--对象行为型模式

Command&#xff08;命令&#xff09;–对象行为型模式 一、意图 将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 二、动机 1.在软件构建过程中&#xff0c;“行为请求…

实现业务数据的同步迁移 · 思路一

&#xff08;好雨知时节&#xff0c;大雨 _ _ _&#xff09;时不时的呢&#xff0c;会有小伙伴问我这样的问题&#xff1a;1、群主&#xff0c;你的.tsv文件是如何生成的&#xff1f;2、在线项目数据和种子数据的不一样&#xff0c;可以下么&#xff1f;3、如果我本地的数据开发…

Interpreter(解释器)--类行为型模式

Interpreter&#xff08;解释器&#xff09;–类行为型模式 一、意图 给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。 二、动机 1.在软件构建过程中&#xff0c;如果某一特定领域的问题比…