适配器模式的理解和实践

        在软件开发中,我们经常遇到需要将一个类的接口转换成客户端所期望的另一种接口的情况。这种接口不匹配问题会导致类之间的不兼容,使得原本可以协同工作的两个类无法在一起工作。为了解决这一问题,适配器模式(Adapter Pattern)应运而生。本文将详细探讨适配器模式的概念、理解以及实践,并通过Java语言进行示例说明。

一、适配器模式概述

        适配器模式是一种结构型设计模式,它通过将一个类的接口转换成另一种接口,使原本不兼容的类可以协同工作。适配器模式的核心思想是为不兼容的接口提供一个中间层,这个中间层负责将一种接口的调用转换为另一种接口的调用,从而实现接口的适配。

        适配器模式主要有两种实现方式:类适配器(通过继承实现)和对象适配器(通过组合实现)。

  1. 类适配器:通过继承源接口(需要适配的接口)和目标接口(客户端期望的接口),并在适配器类中实现目标接口的方法,在方法内部调用源接口的方法。由于Java不支持多重继承,类适配器通常使用继承一个接口和实现另一个接口的方式来实现。

  2. 对象适配器:通过持有源接口的一个实例(通过组合的方式),在适配器类中实现目标接口的方法,并在方法内部调用源接口实例的方法。这种方式更加灵活,因为它不需要继承源接口。

二、适配器模式的结构

        适配器模式主要包含以下几个角色:

  1. 目标接口(Target):客户端期望的接口。
  2. 源接口(Adaptee):需要适配的接口。
  3. 适配器(Adapter):将源接口适配为目标接口的类,它实现了目标接口,并持有源接口的一个实例。

三、适配器模式的理解

        适配器模式的核心思想是通过一个中间层(适配器)将不兼容的接口进行转换,使得原本无法协同工作的两个类可以在一起工作。这种转换可以是方法名称、参数类型、返回类型等的适配。适配器模式不仅解决了接口不兼容的问题,还使得系统更具扩展性和灵活性。

  1. 灵活性:适配器模式通过引入一个中间层,降低了系统各个部分之间的耦合度,使得系统更容易进行扩展和维护。

  2. 复用性:通过适配器模式,可以使得已有的类在不修改其代码的情况下,通过适配器与新的系统进行集成,提高了代码的复用性。

  3. 兼容性:适配器模式使得原本不兼容的接口可以协同工作,提高了系统的兼容性。

四、适配器模式的实践

        为了更好地理解适配器模式,下面通过一个具体的例子来进行说明。

        假设我们有一个旧的电源系统,它使用的是两孔的插座(TwoHoleSocket),而我们现在有一个新的电器设备,它需要使用三孔的插座(ThreeHoleSocket)。为了让这个新的电器设备能够使用旧的电源系统,我们需要一个适配器来将两孔的插座转换成三孔的插座。

        首先,我们定义两个接口,分别表示两孔插座和三孔插座:

// 两孔插座接口
public interface TwoHoleSocket {
    void powerTwoHole();
}

// 三孔插座接口
public interface ThreeHoleSocket {
    void powerThreeHole();
}


        接下来,我们定义一个实现了两孔插座接口的旧电源系统类:

// 旧电源系统类
public class OldPowerSystem implements TwoHoleSocket {
    @Override
    public void powerTwoHole() {
        System.out.println("供电:两孔插座");
    }
}


        然后,我们定义一个电器设备类,它需要使用三孔插座:

// 电器设备类
public class ElectricalAppliance {
    private ThreeHoleSocket socket;

    public ElectricalAppliance(ThreeHoleSocket socket) {
        this.socket = socket;
    }

    public void start() {
        socket.powerThreeHole();
    }
}


        最后,我们定义一个适配器类,它将两孔插座适配成三孔插座:

// 适配器类
public class SocketAdapter implements ThreeHoleSocket {
    private TwoHoleSocket twoHoleSocket;

    public SocketAdapter(TwoHoleSocket twoHoleSocket) {
        this.twoHoleSocket = twoHoleSocket;
    }

    @Override
    public void powerThreeHole() {
        // 在适配器内部进行转换
        System.out.println("适配器:将两孔插座转换成三孔插座");
        twoHoleSocket.powerTwoHole();
    }
}


        现在,我们可以使用这个适配器来将旧电源系统与新的电器设备进行连接:

public class Main {
    public static void main(String[] args) {
        OldPowerSystem oldPowerSystem = new OldPowerSystem();
        SocketAdapter adapter = new SocketAdapter(oldPowerSystem);
        ElectricalAppliance appliance = new ElectricalAppliance(adapter);
        
        appliance.start();
    }
}


        运行上述代码,输出结果如下:

适配器:将两孔插座转换成三孔插座
供电:两孔插座


        通过上述示例,我们可以看到,适配器模式通过引入一个中间层(SocketAdapter),将两孔插座转换成三孔插座,从而使得旧的电源系统能够与新的电器设备进行协同工作。这种方式不仅解决了接口不兼容的问题,还使得系统更具扩展性和灵活性。

五、总结

        适配器模式是一种非常实用的设计模式,它通过引入一个中间层来将不兼容的接口进行转换,使得原本无法协同工作的两个类可以在一起工作。适配器模式提高了系统的灵活性、复用性和兼容性,使得系统更易于扩展和维护。在实际开发中,我们可以根据具体的需求选择类适配器或对象适配器来实现接口的适配。通过适配器模式,我们可以更好地利用已有的代码和组件,降低系统的耦合度,提高系统的可维护性和可扩展性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据分析案例-基于梯度提升决策树回归算法构建医疗保险费用预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

轩凯生物被警示,财务内控不规范,华泰证券又被处罚

作者:Tracy 来源:IPO魔女 11月21日,南京轩凯生物科技股份有限公司(简称“轩凯生物”)被交易所下达书面警示的自律监管函。同时其保荐机构华泰联合证券和会计师事务所天衡,均受到监管处罚。这是今年来&…

IoTDB 常见问题 QA 第二期

关于 IoTDB 的 Q&A IoTDB Q&A 第二期来啦~我们将定期汇总社区讨论频繁的问题,并展开进行详细回答,通过积累常见问题“小百科”,方便大家使用 IoTDB。 Q1:集群扩容方法 问题 问题1:当 IoTDB 集群的存储占用达到…

RT-DETR融合[CVPR2024]Starnet中的star block特征提取模块

RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《Rewrite the Stars》 一、 模块介绍 论文链接:https://arxiv.org/abs/2403.19967 代码链接:https://github.com/ma-xu/Rewrite-the-Stars/tree/main 论…

Java web - 后端开发

一 Maven Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。 Maven的作用

Unity学习笔记(二)如何制作角色动画

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 创建一个角色 我们的目的是创建一个可移动、跳跃、冲刺等动作的角色 需要的组件:Rigidbody(用于创建物理规则)、Collider(用于检测碰撞&am…

Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告Gherkin格式命令行报告

Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告&Gherkin格式命令行报告 前言一、创建Feature文件二、创建步骤定义文件三、生成Cucumber格式的JSON报告四、使用Gherkin格式的命令行报告五、将BDD报告集成到Jenkins中总结 前言 在自动…

harbor镜像仓库搭建

Harbor简介 Harbor的发展背景和现状 Harbor项目起始于2014年左右,当时正值容器技术和微服务架构迅速崛起的时期。随着越来越多的企业开始采用容器化部署应用,对于私有镜像管理的需求也日益增长。传统的解决方案要么缺乏必要的企业级特性(如访问控制、安全性和可扩展性),…

Windows安装Jira

下载 Download Jira Data Center | Atlassian https://product-downloads.atlassian.com/software/jira/downloads/atlassian-jira-software-10.3.0-x64.exe 以管理员身份安装,否则弹出以下提醒 创建和配置MySQL数据库:参照 Connecting Jira applicat…

【企业微信自建应用-前端篇】企业微信自建应用开发流程详细介绍

前言 最近接到需求,需要我在企业微信端自建一个应用,用来接受PC端派发的工单,告警,公告等内容。 这里写一个帖子汇总一下我经历的全流程开发,当然这是基础的流程啊。因为功能要求也不高。后面如果开发更多的东西再补充…

[每周一更]-(第127期):Go新项目-Gin中使用超时中间件实战(11)

在项目不断迭代过程中,发现基础架构中,没有进行超时控制,有些接口由于网络延迟以及远程调用等情况存在请求时间过长的问题,消耗了资源,也降低了用户体验,这一讲我们聊下超时控制中间件,来完善我…

定时/延时任务-Kafka时间轮源码分析

文章目录 1. 概要2. TimingWheel2.1 核心参数2.2 添加任务2.3 推进时间 3. TimerTaskList3.1 添加节点3.2 删除节点3.3 刷新链表3.4 队列相关 4. 时间轮链表节点-TimerTaskEntry5. TimerTask6. Timer 和 SystemTimer - 设计降级逻辑7. 上层调用8. 小结 1. 概要 时间轮的文章&a…

【传感器技术】第6章 压电式传感器,压电材料,压电效应,电压放大器

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

端点鉴别、安全电子邮件、TLS

文章目录 端点鉴别鉴别协议ap 1.0——发送者直接发送一个报文表明身份鉴别协议ap 2.0——ap1.0 的基础上,接收者对报文的来源IP地址进行鉴别鉴别协议ap 3.0——使用秘密口令,口令为鉴别者和被鉴别者之间共享的秘密鉴别协议ap 3.1——对秘密口令进行加密&…

XDOJ 877 图的深度优先遍历

题目:图的深度优先遍历 问题描述 已知无向图的邻接矩阵,以该矩阵为基础,给出深度优先搜索遍历序列,并且给出该无向图的连通分量的个数。在遍历时,当有多个点可选时,优先选择编号小的顶点。(即…

Spring--07-01---@Transactional注解失效的8大场景

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Transactiona1.默认回滚:RuntimeException 1.Transactional注解失效的8大场景1.数据库引擎是否支持事务3.方法不是public的4.自身调用5.数据源没有配置事…

拆解大语言模型RLHF中的PPO

** 拆解大语言模型RLHF中的PPO ** 参考链接:https://zhuanlan.zhihu.com/p/645225982 为什么大多数介绍RLHF的文章,一讲到PPO算法的细节就戛然而止了呢?要么直接略过,要么就只扔出一个PPO的链接。然而LLM PPO跟传统的PPO还是有…

【工业机器视觉】基于深度学习的水表盘读数识别(4-训练与预测)

【工业机器视觉】基于深度学习的仪表盘识读(读数识别)(3)-CSDN博客 训练与预测 Ultralytics YOLO指的是由Ultralytics公司开发的一系列基于YOLO(You Only Look Once)架构的目标检测算法。YOLO是一种实时目标检测系统,它…

Qt Pro 常用配置

Part1: Summary Qt 开发中 Pro 文件的内容很多,需要不断的去学习和使用,现系统性的整理一下。以备录; 1.创建pro文件 1.1 步骤: Qt Creator--->New Project--->应用程序--->Qt Widgets Application--->名称为&…

ChatGPT生成测试用例的最佳实践(一)

前面介绍的案例主要展示了ChatGPT在功能、安全和性能测试用例生成方面的应用和成果。通过ChatGPT生成测试用例,测试团队不仅可以提升工作效率,还可以加快测试工作的速度,尽早发现被测系统中的问题。问题及早发现有助于提高软件的质量和用户满…