【设计模式】适配器模式(结构型)⭐⭐⭐

文章目录

  • 1.概念
    • 1.1 什么是适配器模式
    • 1.2 优点与缺点
  • 2.实现方式
    • 2.1 类适配器模式
    • 2.2 对象适配器模式
  • 3 Java 哪些地方用到了适配器模式
  • 4 Spring 哪些地方用到了适配器模式

1.概念

1.1 什么是适配器模式

简单来说,适配器模式就是作为两个不兼容接口之间的桥梁

1.2 优点与缺点

优点:
1.可以让原本接口不兼容的类可以合作无间。
2.增加了类的透明性和复用性,现有的系统不改变的前提下引进新的接口。
3.灵活性好,可以通过配置文件来更换适配器。
4.系统可以更易于扩展。
缺点:
1.适配器编写过程需要一定的技巧,如果接口差异过大,适配器编写会非常复杂。
2.增加系统的理解与设计难度,由于适配器模式将一些简单的接口转换成复杂的接口,增加阅读难度。

2.实现方式

2.1 类适配器模式

类适配器模式通过多重继承来实现,它同时继承了目标接口和被适配者的类。这样,适配器就可以在继承自被适配者的类的基础上,实现目标接口。

// Lightning接口
public interface Lightning {void chargeLightning();
}// Lightning充电器
public class LightningCharger implements Lightning {@Overridepublic void chargeLightning() {System.out.println("Charging via Lightning connector.");}
}// MicroUSB接口
public interface MicroUSB {void chargeMicroUSB();
}// 类适配器
public class MicroUSBClassAdapter extends LightningCharger implements MicroUSB {@Overridepublic void chargeMicroUSB() {// 直接使用继承自LightningCharger的方法System.out.println("Class Adapter converts MicroUSB to Lightning.");this.chargeLightning();}
}// 使用类适配器模式
public class AdapterDemo {public static void main(String[] args) {MicroUSBClassAdapter microUSBClassAdapter = new MicroUSBClassAdapter();microUSBClassAdapter.chargeMicroUSB();}
}

2.2 对象适配器模式

对象适配器模式通过组合来实现,它持有一个被适配者的实例,并在适配器中实现目标接口。适配器将目标接口的调用转发给被适配者的相应方法。

// Lightning接口
public interface Lightning {void chargeLightning();
}// Lightning充电器
public class LightningCharger implements Lightning {@Overridepublic void chargeLightning() {System.out.println("Charging via Lightning connector.");}
}// MicroUSB接口
public interface MicroUSB {void chargeMicroUSB();
}// 对象适配器
public class MicroUSBObjectAdapter implements MicroUSB {private Lightning lightning;public MicroUSBObjectAdapter(Lightning lightning) {this.lightning = lightning;}@Overridepublic void chargeMicroUSB() {// 适配器将MicroUSB充电请求转换为Lightning充电System.out.println("Object Adapter converts MicroUSB to Lightning.");lightning.chargeLightning();}
}// 使用对象适配器模式
public class AdapterDemo {public static void main(String[] args) {LightningCharger lightningCharger = new LightningCharger();MicroUSBObjectAdapter microUSBObjectAdapter = new MicroUSBObjectAdapter(lightningCharger);microUSBObjectAdapter.chargeMicroUSB();}
}

对象适配器模式更加灵活,因为它可以在运行时改变被适配者的实例,而类适配器模式则在编译时就已经确定了被适配者的类。

3 Java 哪些地方用到了适配器模式

JDBC(Java Database Connectivity): JDBC使用适配器模式来连接不同的数据库。DriverManager类充当适配器,它根据URL选择合适的Driver实现,并将JDBC调用转换为特定数据库的调用。
AWT(Abstract Window Toolkit)事件监听器: AWT使用适配器模式来处理事件。例如,AWTEventMulticaster类充当适配器,它将事件源的事件转发给事件监听器。
Java I/O: Java的I/O库中使用了适配器模式来适配不同的数据源和数据目的地。例如,InputStreamReader和OutputStreamWriter类充当适配器,它们将字节流转换为字符流。
Java Collections Framework: Java集合框架中使用了适配器模式来适配不同的集合类型。例如,Collections.synchronizedCollection方法返回一个线程安全的集合视图,它充当适配器,将非线程安全的集合适配为线程安全的集合。
Java XML解析: Java中解析XML时,可以使用适配器模式来适配不同的XML解析器。例如,SAXParserFactory和DocumentBuilderFactory类充当适配器,它们根据配置选择合适的解析器实现。
Java RMI(Remote Method Invocation): Java RMI中使用了适配器模式来适配远程对象和本地对象。RMI系统提供的代理类充当适配器,它将远程方法调用转换为本地方法调用。
第三方库和框架: 许多第三方库和框架也使用适配器模式来集成不同的技术或API。例如,Spring框架中的AopProxy类充当适配器,它将AOP(面向切面编程)的调用转换为目标对象的调用。

4 Spring 哪些地方用到了适配器模式

AOP(面向切面编程): Spring AOP使用适配器模式来实现方法拦截。Spring的AopProxy类充当适配器,它根据配置创建代理对象,并在目标对象的方法调用前后执行增强代码。
事件发布: Spring的事件驱动模型使用适配器模式来解耦事件的生产者和消费者。ApplicationEventMulticaster类充当适配器,它将事件发布给所有注册的监听器。
事务管理: Spring的事务管理器使用适配器模式来适配不同的事务API。例如,PlatformTransactionManager接口及其各种实现(如DataSourceTransactionManager和JtaTransactionManager)充当适配器,它们将Spring的事务抽象转换为具体的事务处理逻辑。
数据访问: Spring的数据访问模板(如JdbcTemplate、HibernateTemplate等)使用适配器模式来适配不同的数据访问技术。这些模板类充当适配器,它们将Spring的数据访问抽象转换为具体的数据库操作。
Web集成: Spring的Web模块使用适配器模式来集成不同的Web框架。例如,DispatcherServlet充当适配器,它将HTTP请求转换为Spring MVC框架的调用。
资源访问: Spring的ResourceLoader和Resource接口使用适配器模式来抽象不同类型的资源访问。ResourceLoader的实现类充当适配器,它们将资源访问的调用转换为具体文件系统、类路径或URL的访问。
消息服务: Spring的JMS(Java消息服务)集成使用适配器模式来适配不同的消息中间件。JmsTemplate和JmsListenerContainerFactory类充当适配器,它们将Spring的消息抽象转换为具体的消息中间件操作。

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

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

相关文章

Qt for Android 申请摄像头权限

步骤 1. 添加用户权限 AndroidManifest.xml 中新增&#xff08;不添加后面申请选项时不弹窗&#xff09; 或者再Qt Creator中直接添加 2. Qt代码申请权限 Qt自己封装好了一些常用的权限申请&#xff0c; 详情Qt Assistant文档搜索 QPermission查看 #include <QPermi…

关于stm32的软件复位

使用软件复位的目的&#xff1a; 软件复位并不会擦除存储器中的数据&#xff0c;它只是将处理器恢复到复位状态&#xff0c;即中断使能位被清除&#xff0c;系统寄存器被重置&#xff0c;但RAM和Flash存储器中的数据保持不变。 STM32软件复位(基于库文件V3.5) &#xff0c;对…

终于搞懂了!原来vue3中template使用ref无需.value是因为这个

前言 众所周知&#xff0c;vue3的template中使用ref变量无需使用.value。还可以在事件处理器中进行赋值操作时&#xff0c;无需使用.value就可以直接修改ref变量的值&#xff0c;比如&#xff1a;<button click"msg Hello Vue3">change msg</button>。…

买视觉检测设备需要多少钱?

随着工业自动化的发展&#xff0c;其应用范围逐步提高&#xff0c;其中母子图像传感器、CMOS和CCD摄像机、DSP、ARM嵌入式技术、图像处理和模式识别技术的快速发展&#xff0c;有效地推动了视觉检测设备的发展。在机器视觉领域中&#xff0c;常见的就是视觉检测、视觉识别、视觉…

Django里choices字段使用中文使用

如果想要将下面的表格里的内容数字换成对应的内容&#xff1a; 需要更改成这样&#xff1a; 下面是步骤&#xff1a; 在 python 里的 models.py 文件里&#xff0c;创建数据表的时候&#xff0c;用到了 choices class Example(models.Model):name models.CharField(verbose…

vos3000安装外呼系统703一键安装软交换系统

关于VOS3000系统的一键安装&#xff0c;通常这类设备的安装需要遵循制造商提供的官方指南。由于VOS3000是一个专业的通信系统&#xff0c;安装过程可能涉及到硬件配置、网络设置、系统参数配置等多个步骤。以下是一般的安装步骤&#xff0c;但请注意&#xff0c;具体的安装方法…

领菲linfeeLNF96E多功能电力仪表智能数码液晶显示三相电压电流表

品牌 LINFEE 型号 LNF96E 货号 LNF96E 产地 中国大陆 省份 江苏省 地市 无锡市 装修及施工内容 安装工程 电源电路 交流电表 电表类型 多功能电度表 颜色分类 LNF96E-C,LNF96E-CM,LNF96E-CJ,LNF96E-CK,LNF96E-CJK,LNF96E-CMJK 多功能电力仪表,LNF96E三相多…

【SAP HANA 34】HANA查找函数LOCATE的使用

在SQL中通常需要查找字符串中是否包含某个字符的情况,类似与Java或者JS中的indexOf 的函数 在HANA中使用locate函数也可满足需求。 1、函数用途 查找一个子字符串(needle)在另一个字符串(haystack)中的位置。2、语法 LOCATE ( <string-expression1>, <string-…

图像的IO操作

代码&#xff1a; import cv2 as cvimport matplotlib.pyplot as plt​#读取图像img cv.imread("../data/images/zidane.jpg")​#显示图像#2.1 OpenCVcv.imshow("dili",img)cv.waitKey(0)cv.destroyAllWindows()​#2.2 matplotlibplt.imshow(img[:,:,::-…

优化你的WordPress网站:内链建设与Link Whisper Pro插件的利用

文章目录 内链的重要性WordPress SEO插件&#xff1a;Link Whisper Pro主要功能使用指南下载与安装 结语 在数字营销和网站管理领域&#xff0c;SEO内部优化是提升网站排名、增加流量和提高用户参与度的核心策略。在众多SEO技巧中&#xff0c;内链建设是构建良好网站结构和提升…

2024最新华为OD机试-C/D卷 - 在线OJ使用说明

文章目录 &#x1fa90;在线 OJ 入口&#x1f3a7;申请OD使用权限&#x1f353;在线 OJ 的使用说明OJ主界面专题系列语言支持评测结果 &#x1fa90;在线 OJ 入口 &#x1f517; 2024最新华为OD机试 - 在线OJ入 &#x1f3a7;申请OD使用权限 本专栏配套 OJ 的为了配合考友更高…

Python实现连连看7

3.3 根据地图显示图片 在获取了图片地图之后,就可以根据该图片地图显示图片了。显示图片的功能在自定义函数drawMap()中实现。 3.3.1 清除画布中的内容 在画布上显示图片之前,需要将画布中图1的启动界面内容清除,代码如下所示。 canvas.delete(all) 其中,delete()方法…

如何提升WAS存储设备管理的安全性及数据访问的流畅性?

随着企业数据飞速增长&#xff0c;越来越多的核心数据通过专业存储设备存储&#xff0c;客户对存储设备的安全性、效率和成本格外关注。其中WAS存储设备管理通常指的是对Windows Azure Storage&#xff08;WAS&#xff09;的存储设备进行管理。WAS存储设备管理存在一些弊端和不…

材料科学领域科技查新点提炼方法!---附案例

材料科学是研究材料的组织结构、性质、生产流程、使用效能及它们之间的相互关系的科学&#xff0c;集物理学、化学、冶金学等于一体。随着科技的发展&#xff0c;纳米技术和生物技术也广泛应用到该领域中。从材质上可以分为金属材料、无机非金属材料、有机高分子材料和复合材料…

JC/T 2186-2013 室内墙面轻质装饰板用免钉胶检测

免钉胶&#xff0c;是指一种粘合力极强的多功能建筑结构强力胶&#xff0c;具有粘接强度高&#xff0c;易施工&#xff0c;环保等性能&#xff0c; 常用于建筑&#xff0c;家具等领域。 JC/T 2186-2013室内墙面轻质装饰板用免钉胶测试项目&#xff1a; 测试项目 测试标准 外…

MySQL迁移达梦数据库避坑

实体类字段receiver定义为String类型 MySQL中为blob类型&#xff0c;迁移到dm8同样为blob类型。 但是使用dm8数据库执行查询列表方法时&#xff0c;语法冲突 出现-6105: 第1 行附近出现错误: LambdaQueryWrapper<PfMessageReal> query new LambdaQueryWrapper<Pf…

阿奇科技 简单java-swing计算器源码(可用于课设等)

此系统用的技术有java swing&#xff01; 实现的功能&#xff1a; 加减乘除&#xff08;可以进行小数运算&#xff09; 清空数据 最小化 小巧方便&#xff0c;功能齐全&#xff01; 页面截图: 源码地址&#xff1a;点击这里下载源码 获取全套代码&#xff0c;或咨询更多代码…

vue 如何制作一个跟随窗口大小变化而变化的组件

vue 如何制作一个跟随窗口大小变化而变化的组件 像下图中展示的那些统计数件就是跟随窗口变化而变化的&#xff0c;而且是几乎等比缩放的。 实现原理 只简略说一下原理。 pinia 中记录一个窗口变化的高度值给要变化的组件添加一个高度值组件内部所有关于长度距离的值都通过这…

【启明智显彩屏应用】Model3A 7寸触摸屏在真空包装机上的应用解决方案

一、项目背景与需求 随着工业自动化水平的提升&#xff0c;对真空包装机的操作界面和控制精度要求也越来越高。为满足这一需求&#xff0c;我们提出了基于Model3A工业级HMI&#xff08;人机界面&#xff09;芯片方案的7寸触摸屏解决方案&#xff0c;旨在提高真空包装机的操作便…

联邦学习在non-iid数据集上的划分和训练——从零开始实现

虽然网上已经有了很多关于Dirichlet分布进行数据划分的原理和方法介绍&#xff0c;但是整个完整的联邦学习过程还是少有人分享。今天就从零开始实现 加载FashionMNIST数据集 import torch from torchvision import datasets, transforms# 定义数据转换 transform transforms…