「聊设计模式」之适配器模式(Adapter)


🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!


前言

  在软件开发中,经常会涉及到现有系统的改造和升级。为了适应新的需求,我们需要对旧系统进行修改,但是,这些修改可能会破坏原有的架构,给系统带来风险。适配器模式(Adapter)可以在不改变原有系统的基础上,将新需求的接口转换为旧系统的接口,实现两者之间的兼容性。

摘要

  适配器模式是一种结构型设计模式,它可以将一个类的接口转换为客户希望的另一个接口。适配器模式将原来不兼容的类结合在一起工作,增加了系统的灵活性和可复用性。

适配器模式

概念

  适配器模式由三个角色组成:目标抽象类、适配器类和适配者类。

  • 目标抽象类:定义客户所需接口,可以是一个抽象类或接口。
  • 适配器类:实现目标接口,并持有适配者对象的引用。
  • 适配者类:旧的接口实现类,不符合客户需求。

  适配器模式的核心思想是通过适配器类在目标抽象类和适配者类之间建立一个桥梁,使得两者可以协同工作,实现客户所需要的功能。

模式的结构

  适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将不兼容的对象封装到一个适配器中,以使其与另一个对象相兼容。

适配器模式的结构包括以下几个角色:

  1. 目标抽象类(Target):定义客户端使用的业务接口,客户端通过该接口访问适配器中封装的对象。

  2. 适配器类(Adapter):将不兼容的对象适配成目标抽象类所定义的接口,适配器类通常包含一个或多个被适配的对象。

  3. 被适配者类(Adaptee):原本不兼容的对象,它需要被适配器适配成目标抽象类所定义的接口。

  4. 客户端(Client):通过目标抽象类定义的接口访问适配器中封装的对象。

适配器模式的结构可以用以下UML图表示:
在这里插入图片描述

  适配器模式的基本思想是将一个对象转换成另一个对象,以满足客户端的需求。适配器模式通常用于系统的升级和维护,它能够很好地解决系统中存在的兼容性问题。

模式的实现

  我们以Java语言为例,来演示适配器模式的实现。假设我们有一个旧的类OldServiceImpl,它提供了一个方法oldMethod,但是它的接口不符合我们的需求。我们需要将它的接口转换为我们需要的NewService接口。

public class OldServiceImpl {public void oldMethod() {// 旧的接口实现System.out.println("旧的接口实现");}
}

  首先,我们需要定义一个目标抽象类NewService,它定义了我们需要的接口。

public interface NewService {void newMethod();
}

  然后,我们需要创建一个适配器类Adapter,它实现了NewService接口,并持有OldServiceImpl对象的引用。在newMethod方法中,调用OldServiceImploldMethod方法。

public class Adapter implements NewService {private OldServiceImpl oldServiceImpl;public Adapter(OldServiceImpl oldServiceImpl) {this.oldServiceImpl = oldServiceImpl;}@Overridepublic void newMethod() {oldServiceImpl.oldMethod();}
}

  最后,我们可以使用适配器模式将旧的接口转换为新的接口。

package com.example.javaDesignPattern.adapter;/*** @author bug菌* @version 1.0* @date 2023/9/19 11:02*/
public class Client {public static void main(String[] args) {OldServiceImpl oldServiceImpl = new OldServiceImpl();NewService newService = new Adapter(oldServiceImpl);newService.newMethod();}
}

执行结果如下:

在这里插入图片描述

代码解读:

这段代码是一个简单的测试类,用于测试适配器模式。其中:

  • OldServiceImpl 是一个已经存在的、老的服务接口实现类。
  • NewService 是一个新的服务接口,它有 OldService 中没有的新方法。
  • Adapter 是适配器类,它实现了 NewService 接口,并将 NewService 的方法调用转化为 OldService 的方法调用。

  定义了一个名为 adapter 的类,并在其中创建了一个 main 方法作为程序的入口。在 main 方法中,首先实例化了一个 OldServiceImpl 对象,然后通过创建一个名为 Adapter 的适配器对象,将旧服务的实现对象 oldServiceImpl 适配成了新服务的实现对象,即将其转换为 NewService 接口能够调用的对象。最后,调用新服务的 newMethod 方法,测试转换是否成功。

全文小结

  适配器模式是一种常用的设计模式,它可以将旧的接口转换为新的接口。通过适配器模式,我们可以兼容现有系统和新需求之间的差异,同时提高系统的灵活性和可复用性。

附录源码

  如上涉及代码均已上传同步在GitHub,提供给同学们参考性学习。

总结

  适配器模式是一种结构型设计模式,它允许我们将一个类的接口转换为客户所期望的另一个接口。通过适配器模式,我们可以在不改变原有系统的基础上,实现新需求和旧系统之间的兼容性。适配器模式的核心思想是通过适配器类在目标抽象类和适配者类之间建立一个桥梁,使得两者可以协同工作。

☀️建议/推荐你


  如果想系统性的全面学习设计模式,建议小伙伴们直接毫无顾忌的关注这个专栏《聊设计模式》,无论你是想提升自己的编程技术,还是渴望更好地理解代码背后的设计思想,本专栏都会为你提供实用的知识和启发,帮助你更好地解决日常开发中的挑战,将代码变得更加优雅、灵活和可维护!

📣关于我


我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

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

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

相关文章

1. 快速体验 VSCode 和 CMake 创建 C/C++项目

1. 快速体验 VSCode 和 CMake 创建 C/C项目 本章的全部代码和markdown文件地址: CMake_Tutorial,欢迎互相交流. 此次介绍的内容都是针对于 Linux 操作系统上的开发过程. 1.1 安装开发工具 VSCode: 自行下载安装, 然后安装插件 Cmake:在 Ubuntu 系统上, 可以采用 ap…

浅析三维模型3DTile格式轻量化处理常见问题与处理措施

浅析三维模型3DTile格式轻量化处理常见问题与处理措施 三维模型3DTile格式的轻量化处理是大规模三维地理空间数据可视化的关键环节,但在实际操作过程中,往往会遇到一些问题。下面我们来看一下这些常见的问题以及对应的处理措施。 变形过大:压…

阿里云无影云电脑和传统PC有什么区别?

阿里云无影云电脑和传统电脑PC有什么区别?区别大了,无影云电脑是云端的桌面服务,传统PC是本地的硬件计算机,无影云电脑的数据是保存在云端,本地传统PC的数据是保存在本地客户端,阿里云百科分享阿里云无影云…

基于AR增强现实模拟离心泵结构拆装与运行

通过AR模拟,学生可以虚拟地观察离心泵的结构和部件,进行拆装、安装和调试的操作,而无需实际接触物理设备。这极大地降低了学生操作过程中的风险。 AR模拟离心泵的拆装过程可以分为几个步骤。首先,学生选择相应的模拟程序&#xff…

git 查看当前版本号

你看,那个人好像一条狗哎。 ——周星驰 《大话西游》 要查看当前 Git 仓库的版本号,您可以使用以下命令: git log --oneline -n 1 这会显示最近一次的提交信息,包括提交的哈希值(版本号)和提交的摘要信息…

2023/9/17总结

Vue defineOptions 为什么要使用defineOptions 在有<script setup> 之前 如果需要定义props emit 可以很容易的添加一个与setup 平级的属性 但是用了 <script setup> 后 就不能这样做了 setup 属性也就没有了&#xff0c;就不能添加 与其平级 的属性 为了解…

Linux(下)

一、 对netstat的补充 1.进程管理 在杀死进程时&#xff0c;不可以杀死其他用户的进程。 查看指定进程时&#xff0c;下图的第二行 是ps -ef | grep tail 命令执行的进程 kill -9 进程号 也可以写作 kill -s 9 进程号 机器人&#xff1a; 2.查看主机状态 2.1 top命令&…

Git 基本操作【本地仓库与远程仓库的推送、克隆和拉取】

文章目录 一、Git简介二、Git的下载安装三、Git常规命令四、新建本地仓库五、本地分支操作六、Git远程仓库七、远程仓库克隆、抓取和拉取八、总结九、学习交流 一、Git简介 Git是分布式版本控制系统&#xff08;Distributed Version Control System&#xff0c;简称 DVCS&…

智能AI写作系统+ChatGPT程序源码搭建部署教程+支持GPT4.0/AI绘画

一、SparkAI智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文…

驱动开发,udev机制创建设备节点的过程分析

1.创建设备文件的机制种类 mknod命令&#xff1a;手动创建设备节点的命令 devfs:可以用于创建设备节点&#xff0c;创建设备节点的逻辑在内核空间&#xff08;内核2.4版本之前使用&#xff09; udev:自动创建设备节点的机制&#xff0c;创建设备节点的逻辑在用户空间&#xf…

基于Java+SpringBoot+Vue的旧物置换网站设计和实现

基于JavaSpringBootVue的旧物置换网站设计和实现 源码传送入口前言主要技术系统设计功能截图数据库设计代码论文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 摘 要 随着时代在一步一步在进步&#xff0c;旧物也成人们的烦恼&#xff0c;…

一键畅享云端ERP:使用Cpolar内网穿透将用友U8 Cloud部署至外网

文章目录 前言1. 用户需求2. Cpolar内网穿透的安装和注册2.1 Cpolar云端设置2.2 Cpolar Web UI本地设置 3. 公网访问测试 前言 用友U8 Cloud是用友公司推出的一款云端ERP解决方案。它以云计算技术为基础&#xff0c;为企业提供全面的企业资源管理解决方案&#xff0c;涵盖了财…