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

news2024/11/23 6:19:52

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


前言

  在软件开发中,经常会涉及到现有系统的改造和升级。为了适应新的需求,我们需要对旧系统进行修改,但是,这些修改可能会破坏原有的架构,给系统带来风险。适配器模式(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;
    }

    @Override
    public 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.coloradmin.cn/o/1022164.html

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

相关文章

微信小程序云开发手搓微标提示,逻辑思路记录及代码实现

目录 写前小叙 功能需求背景 首页js的逻辑思路第一部分 发布公告js逻辑 首页js显示“新”公告思路实现 首页js关闭“新”公告思路实现 管理员“已阅读”js逻辑 首页js显示“新”邮件思路实现 首页js关闭“新”邮件思路实现 写前小叙 今儿凌晨,我又是一个人…

【Python】福利彩票复式模拟选号程序

【效果】 【注意】 逻辑是用Random模拟10000次复试彩票选号,然后给出最大可能性一组。但是模拟终究是模拟,和现实彩票结果没有任何联系,下载下来玩就是了,没人能保证模拟出中奖号码,不要投机,不要投机! 【修改】 代码很简单,如果想改成不是复式的,自行修改即可。 如…

linux学习实操计划0103-安装软件

本系列内容全部给基于Ubuntu操作系统。 系统版本:#32~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 18 10:40:13 UTC 1 安装deb格式软件 Debian包是Unixar的标准归档,将包文件信息以及包内容,经过gzip和tar打包而成。 处理这些包的经典程序是…

【IntelliJ IDEA】切换jdk版本配置

需求描述 idea 2020.3.1 原来idea使用的是jdk8的版本,想换成jdk7的版本,该怎么配置呢?配置哪些地方呢? 解决方法 local1 先在Project Structure中,添加上刚安装的jdk7(它的安装目录) local…

数据结构——线性表之顺序表

目录 一.线性表 二.顺序表实现 2.1 概念及结构 2.2 动态顺序表 2.2.1 初始化与销毁函数 2.2.2 打印函数 2.2.3 尾插函数 2.2.4 尾删函数 2.2.5 扩容函数 2.2.6 头插函数 2.2.7 头删函数 2.2.8 任意位置插入函数 2.2.9 查找函数 2.2.10 任意位置删除函数 2.2.11 修…

2023年9月中国数据库排行榜:阿里叱咤云端登榜眼,华为中兴厚积薄发显峥嵘

鸿鹄展翅凌云志,骏马扬蹄踏雪心。 2023年9月的 墨天轮中国数据库流行度排行 火热出炉,本月共有287个数据库参与排名。本月排行榜前十中,OceanBase 连续10个月稳居榜首,头部产品得分差距日益缩小,阿里华为两大云厂商持续…

react使用内联css样式的注意点

react使用内联css样式: 就是直接在元素标签的style属性中写css样式,但是这里有三个注意点: 1. style等号后面必须接双大括号也就是 style{{ xx: xx }} 这样 2. css的属性必须写成驼峰型,不能有中横线,比如marginRight, 而不能说margin-righ…

Axure原型设计累加器计时器设计效果(职业院校技能大赛物联网技术应用项目原型设计题目)

目录 前言 一、本题实现效果 二、操作步骤 1.新建文件 2.界面设计 2.1文本框 2.2 按钮 2.3设计界面完成 3.交互 3.1启动交互设置 3.2 分别设置三个属性 3.2.1 设置值为“0” 3.2.2 文字于文本框 3.2.3 获取焦点时 3.3 停止按钮的交互动作 3.3.1 设置变量值 3.4 重…

CAC2023交流群(将持续更新至会议结束)

为青年才俊们提供一个信息交换平台 看到大家对中国自动化大会非常感兴趣并踊跃投稿,虽然我和组委会没有什么直接联系,也是一个菜菜。只是把之前走过的坑写了出来,当然,这个会议你会投了,其它会议也是大同小异。 想必…

java刷题知识点

文章目录 牛客网volatile字符串数组和字符数组管道解决hash冲突Java的体系结构包含下面有关servlet的层级结构和常用的类,说法正确的有?关于ThreadLocal类 以下说法正确的是off-heap是指那种内存集合和map的的继承实现关系抽象类和接口的区别节点流与处理流语句&am…

Solidity 小白教程:21. 调用其他合约

Solidity 小白教程:21. 调用其他合约 调用已部署合约 开发者写智能合约来调用其他合约,这让以太坊网络上的程序可以复用,从而建立繁荣的生态。很多web3项目依赖于调用其他合约,比如收益农场(yield farming&#xff0…

SAP FI 中的重要报告

目录 总账科目表 GL总账清单 GL总账余额 总账科目总计和余额 AR客户主数据列表 AR 客户余额 AR客户订单项 AR客户未清项目 AR客户付款记录 AR供应商主数据 AR供应商余额 AR供应商订单额 AR供应商未清项目 总账科目表 在 SAP 命令字段中输入交易代码 S_ALR_870123…

数据分享|R语言生态学种群空间点格局分析:聚类泊松点过程对植物、蚂蚁巢穴分布数据可视化...

全文链接 :https://tecdat.cn/?p33676 点模式分析(点格局分析)是一组用于分析空间点数据的技术。在生态学中,这种类型的分析可能在客户的几个情境下出现,但对数据生成方式做出了特定的假设,因此让我们首先看看哪些生态…

中秋国庆假期——模板推荐

要说最近能让人开心的事情是什么?大概就是下周将迎来8天假,小编帮大家数了数还有11天,就要放中秋国庆的假期了。作为一个资深打工人,本周的日常即将变成:上班想放假、下班想放假、想放假… 但是宝子们要注意,大家在盼…

JDK8升级JDK11最全实践干货来了 | 京东云技术团队

1、前言 截至目前(2023年),Java8发布至今已有9年,2018年9月25日,Oracle发布了Java11,这是Java8之后的首个LTS版本。那么从JDK8到JDK11,到底带来了哪些特性呢?值得我们升级吗&#x…

js中哪些地方会用到window?

前言 Window 对象是JavaScript中的顶层对象,它代表了浏览器中打开的窗口或者标签页。浏览器中打开的每一个窗口/标签页都会有一个对应的 Window 对象。在浏览器中,全局作用域的 this 就是指向 Window 对象。 正文 在 JavaScript 中,window 对…

《Python趣味工具》——自制emoji3

今日目标 在上次,我们绘制了静态的emoji图。并且总结了turtle中的常用函数。 本次我们将尝试制作一个动态的emoji,让你的表情包动起来! 文章目录 一、动画原理:二、制作动画:1. 修改eyes_black()函数:2. 绘…

构建可维护的大规模应用:框架架构的最佳实践

文章目录 框架架构的重要性最佳实践1. 模块化设计2. 遵循SOLID原则3. 使用设计模式4. 异常处理5. 代码注释和文档6. 测试 Spring Boot 和 Django:关键框架示例Spring Boot(Java)模块化设计:SOLID原则:设计模式&#xf…

分类散点图 stripplot() 加辅助线axhline() 多图合一

分类散点图 stripplot 加辅助线axhline 多图合一 效果图代码 画图没有什么可说的,直接上图 效果图 代码 # 绘制图, 查看是否数值在阈值上 plt.figure(figsize(30, 18)) n 0 for header, value_list in info_dict.items():ref_value_list ref_info_dic…

three.js——通过顶点和顶点索引创建集合体

通过顶点和顶点索引创建集合体 效果图1、创建顶点数据2、创建顶点属性3、创建材质4、创建网格5、改变网格的位置并添加到场景中6、通过顶点索引创建几何图形 效果图 1、创建顶点数据 // 创建顶点数据 每三个一个顶点 逆时针为正面 const vertices new Float32Array([ -1.0, -…