设计模式- 适配器模式(Adapter Pattern)结构|原理|优缺点|场景|示例

                                    设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)       策略模式        模板方法模式        观察者模式        迭代器模式        责任链模式        命令模式

                                   备忘录模式          状态模式          访问者模式        中介者模式    


适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个接口转换为客户期望的另一个接口,从而使原本不兼容的类能够协同工作。适配器模式的主要目的是解决接口不匹配的问题,它通过创建一个适配器类,将源接口转换为目标接口,使得原本无法直接交互的类能够通过适配器进行通信。

模式结构

适配器模式通常包含以下角色:

  1. 目标接口(Target):定义客户端期望的接口,可以是一个接口或抽象类。目标接口是客户程序需要使用的接口。

  2. 源接口(Adaptee):需要被适配的接口,通常是第三方提供的接口或者遗留系统中的接口。

  3. 适配器(Adapter):适配器类实现了目标接口,并持有源接口的一个实例。适配器类通过将源接口的方法映射到目标接口的方法,使得客户端可以像使用目标接口一样使用源接口。

工作原理

  • 客户端:调用适配器对象的目标接口方法,与源接口无关。
  • 适配器:实现目标接口,内部持有源接口对象的引用。适配器在实现目标接口方法时,调用源接口对象的相关方法,将源接口的接口转换为客户端期望的目标接口。

适配器模式的两种形式

  1. 类适配器:适配器类通过继承源接口(Adaptee)并实现目标接口(Target)来实现适配。这种方式要求源接口必须是具体类,且目标接口和源接口之间要有一定的继承关系或共同父类。

  2. 对象适配器:适配器类通过组合(持有源接口对象的引用)而非继承来实现适配。适配器类实现目标接口,并在其方法中调用源接口对象的方法。这种方式更灵活,不要求源接口必须是具体类,也不要求源接口与目标接口之间有继承关系。

优缺点

优点
  • 复用现存类:适配器模式允许在不修改现有代码的情况下,将一个类的接口转换为另一个接口,使得现有类可以被复用。
  • 兼容性:通过适配器模式,可以使原本不兼容的接口之间能够协同工作,提高了系统的兼容性。
  • 灵活性:对象适配器模式可以将一个接口转换成多个接口,而类适配器模式由于Java的单继承限制,只能一对一地适配。
缺点
  • 过多的适配器:如果系统中存在大量的适配器类,可能会增加系统的复杂性,不易管理。
  • 过多的类:在使用类适配器时,可能会增加类的数量,特别是当系统中存在大量需要适配的类时。

适用场景

  • 需要使用一个已经存在的类,但它的接口不符合需求:可以通过适配器模式创建一个适配器类,将已有类的接口转换为期望的接口。
  • 想要创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作:适配器模式可以将目标接口与源接口解耦,使得适配器类可以适应更多的源接口。
  • 需要使用几个具有类似功能但接口不兼容的类:通过适配器模式可以创建统一的接口,简化客户端代码。

代码示例(以Java为例,展示对象适配器)

// 目标接口
public interface Target {void request();
}// 源接口(被适配的接口)
public class Adaptee {public void specificRequest() {System.out.println("Adaptee-specific request");}
}// 适配器类
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}// 客户端代码
public class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();  // 输出:Adaptee-specific request}
}

在这个Java示例中:

  • Target接口代表客户端期望的接口。
  • Adaptee类是需要被适配的源接口。
  • Adapter类实现了Target接口,并持有一个Adaptee对象的引用。在request()方法中,调用了adaptee.specificRequest(),实现了接口的适配。
  • 客户端代码创建Adaptee对象,然后通过Adapter将其包装成Target接口,并调用request()方法,实现了源接口与目标接口之间的转换。

 代码示例(以Python为例)

# 目标接口
class Target:def request(self):raise NotImplementedError("Subclasses must implement this method")# 源接口(被适配的接口)
class Adaptee:def specific_request(self):print("Adaptee-specific request")# 适配器类
class Adapter(Target):def __init__(self, adaptee: Adaptee):self._adaptee = adapteedef request(self):self._adaptee.specific_request()# 客户端代码
def main():adaptee = Adaptee()adapter = Adapter(adaptee)adapter.request()  # 输出:Adaptee-specific requestif __name__ == "__main__":main()

在这个Python示例中:

  • Target类作为目标接口,定义了request()方法,要求子类必须实现。
  • Adaptee类是需要被适配的源接口,提供了specific_request()方法。
  • Adapter类继承自Target,实现了request()方法。在该方法中,调用了_adaptee.specific_request(),将源接口的方法映射到目标接口的方法上,实现了接口的适配。
  • 客户端代码创建Adaptee对象,然后通过Adapter将其包装成Target接口,并调用request()方法,实现了源接口与目标接口之间的转换。

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

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

相关文章

【Python】深入解析Python中的eval()函数

你是魔鬼中的天使 所以送我心碎的方式 是让我笑到最后一秒为止 才发现自己胸口插了一把刀子 你是魔鬼中的天使 让恨变成太俗气的事 从眼里流下谢谢两个字 尽管叫我疯子 不准叫我傻子 🎵 田馥甄《魔鬼中的天使》 Python的eval()函数是一个强大而…

Powershell 一键安装 virtio_qemu_agent

前言 qemu-guest-agent qemu-guest-agent是一个助手守护进程,安装在客户机中。它用于在主机和客户端之间交换信息,并在客户端执行命令。 在Proxmox VE中,qemu-guest-agent主要用于三件事: 正确关闭客户机,而不是依赖于ACPI命令或windows策略在进行备份/快照时冻结客户机…

plt.show()输出<Figure size 1200x800 with 1 Axes>没有展示出图片在notebook里

解决方法如下: 在Jupyter Notebook中,如果使用plt.show()没有直接显示图像,可能是由于某些设置或限制导致的。您可以尝试使用%matplotlib inline魔术命令来确保图像能够直接显示在Notebook中。请在Notebook的第一个单元格中执行以下命令&…

世界首台能探测单个原子的量子模拟器,诞生!

量子物理学依赖于高精度的传感技术,以便深入研究材料的微观特性。近期开发的模拟量子处理器显示出量子气体显微镜在原子层面理解量子系统方面的强大潜力。这种显微镜可以生成极高分辨率的量子气体图像,甚至能够检测到单个原子。 在西班牙巴塞罗那的ICFO&…

flutter android studio升级java java17

oricle 网站下载jdk 17sudo dpkg -i 安装包。到android-studio 目录, mv jbr jbr_bak ln -s /usr/lib/jvm/jdk-17-oracle-x64 jre ln -s /usr/lib/jvm/jdk-17-oracle-x64 jbr 更新.bashrc里面 JAVA_HOMEusr/lib/jvm/jdk-17-oracle-x64 jresource .bashrc然后运行f…

156.25MHz的差分晶体振荡器SG3225VEN

数字经济正焕发出勃勃生机,云计算,大数据,5G和人工智能等新技术的发展给行业带来了新的机遇。无论是在数据中心内部还是在数据中心之间,提供低成本,高速的100/200/400G小型化解决方案都是光模块的发展需求。为了使DSP稳定工作,需要一个小型的封装晶体振荡器来提供参…

书生·浦语大模型第二期实战营第六节-Lagent AgentLego 智能体应用搭建 笔记和作业

来源: 视频教程:Lagent & AgentLego 智能体应用搭建 文字教程: Lagent Web Demo:https://github.com/InternLM/Tutorial/blob/camp2/agent/lagent.md#1-lagent-web-demo AgentLego: https://github.com/Inter…

ComfyUI学习旅程

一、模型文件(Checkpoint) 首先它很大,这些文件是你从huggingface或者civitai下载而来的, 所以这些大文件如 .ckpt 或 .safetensors ,实际上包含了什么内容呢? 它包含了包含了三种不同模型的权重&#x…

做大模型产品,如何设计prompt?

做GenAI产品,除了要设计好的AI任务流程,合理的拆分业务以外,最重要的就是写好prompt,管理好prompt,持续迭代prompt。 prompt一般有两种形式:结构化prompt和对话式prompt。 结构化prompt的优点是通过规范的…

Odoo:全球排名第一的免费开源PLM管理系统介绍

概述 利用开源智造OdooPLM产品生命周期管理应用,重塑创新 实现产品生命周期管理数字化,高效定义、开发、交付和管理创新的可持续产品,拥抱数字化供应链。 通过开源智造基于Odoo开源技术平台打造数字化的产品生命周期管理(PLM&am…

allegro输出正反面bom

不是前面两条命令,而是component report

【Linux驱动层】iTOP-RK3568学习之路(五):并发与竞争

本人在听讯为的课时,哪怕是照抄,编译后,这里的代码执行不了,只能做笔记了。 一、原子操作 ​ 借用原子是"化学反应中最小的微粒“这个概念,用原子来表述—个操作是不可以被打断,拆分的操作。简单&…

李沐65_注意力分数——自学笔记

Additive Attention 等价于将key和value合并起来后放入到一个隐藏大小为h输出大小为1的单隐藏层 总结 1.注意力分数是query和key的相似度,注意力权重是分数的softmax结果 2.两种常见的分数计算: (1)将query和key合并起来进入一个单输出单…

Linux 防火墙端口设置常用命令

应对安全检查,服务器启用防火墙,关闭端口访问,以IP白名单方式对内开发 在Linux系统中设置防火墙端口通常涉及到以下步骤。这里以常用的firewalld服务为例进行说明,适用于大多数现代Linux发行版如RHEL、CentOS、Fedora等。如果您使用的是较旧的系统或配置了其他防火墙软件(…

模块三:二分——852.山脉数组的峰顶索引

文章目录 题目描述算法原理解法一:暴力查找解法二:二分查找 代码实现暴力查找二分——C二分——Java 题目描述 题目链接:852.山脉数组的峰顶索引 算法原理 解法一:暴力查找 峰顶:比左右区间都大 遍历整个数组&…

谷歌搜索SEO优化需要做什么?

最基本的要求,网站基础要优化好,让你的网站更加友好地服务于用户和搜索引擎,首先你要保证你的网站也适配手机端,现在手机端,如果你的网站在手机上打开慢,或者没有适配手机端,让用户用手机看着电…

激励与约束的协同效应—人力资源管理的新趋势

随着全球经济一体化的深入发展,企业间的竞争愈发激烈,人力资源作为企业最宝贵的资源之一,其管理的重要性日益凸显。在这样的背景下,激励与约束的协同效应成为了人力资源管理的新趋势,它不仅能够提高员工的工作积极性&a…

网络安全之WebShell截获

不知道这是哪个大哥的手笔有没有认领的20240424十一点四十分左右 大哥计算机的具体信息贴上了,还好大哥没有put成功,返回405! IP地址 31.49.67.43:36668 MAC地址 80:05:88:48:37:b5ToolB的MAC地址厂商信息查询网站:https://tool…

笔记:VMware之性能优化

目标:通过调整VMware设置,提高VMware中虚拟机性能 版本:16.2.2 build-19200509 一、首选项 针对所有虚拟机设置,对所有虚拟机都有效 1.1 设置路径:主页->编辑->首选项->更新 软件更新,取消“…

线程池嵌套导致的死锁问题

1、背景 有一个报告功能,报告需要生成1个word,6个excel附件,总共7个文件,需要记录报告生成进度,进度字段jd初始化是0,每个文件生成成功进度加1,生成失败就把生成状态置为失败。 更新进度语句&…