当前位置: 首页 > news >正文

设计模式-适配器

文章目录

  • 一、简介
  • 二、适配器模式基础
    • 1. 适配器模式定义与分类
    • 2. 适配器模式的作用与优势
    • 3.UML图
  • 三、适配器模式实现方式
    • 1. 类适配器模式
    • 2. 对象适配器模式
    • 3.类适配器模式和对象适配器模式对比
  • 四、适配器模式应用场景
    • 1. 继承与接口的适配
    • 2. 跨平台适配
  • 五、适配器模式与其他设计模式关系
    • 1. 适配器模式与装饰器模式的区别与联系
    • 2. 适配器模式与桥接模式的区别与联系
  • 六、总结

一、简介

  • 设计模式概述
    设计模式是软件开发中常用的解决问题的经验总结,它们提供了一种被广泛接受的最佳实践。设计模式可以帮助开发人员更好地组织和设计代码,提高代码的可读性、可维护性和可扩展性。
  • 适配器模式介绍
    适配器模式(Adapter Pattern)是一种常用的结构型设计模式。它主要用于将一个类的接口转换成另一个类所期望的接口,以解决不兼容的接口之间的问题。适配器模式可以使得原本不兼容的类能够协同工作。
    适配器模式的核心思想是创建一个适配器类,该适配器类实现目标接口,并持有一个被适配的对象。适配器类在调用目标接口方法时,实际上会调用被适配对象的方法来完成相应的功能。
    适配器模式可以分为类适配器模式和对象适配器模式两种实现方式。类适配器模式使用继承来实现适配,而对象适配器模式使用组合来实现适配。两种方式各有优缺点,开发人员需要根据具体情况选择合适的方式来应用适配器模式。

二、适配器模式基础

1. 适配器模式定义与分类

适配器模式是一种结构型设计模式,它允许将不兼容的接口转换为可兼容的接口。根据适配器与被适配者之间的关系,适配器模式可以分为类适配器模式和对象适配器模式。

2. 适配器模式的作用与优势

适配器模式的主要作用是解决两个不兼容接口之间的兼容性问题,使得它们能够协同工作。适配器模式的优势包括:

  • 提供接口的转换,使得原本不兼容的类能够协同工作。
  • 可以增加额外的逻辑处理,如数据转换、格式化等。
  • 提高代码的复用性和灵活性。

3.UML图

在这里插入图片描述

三、适配器模式实现方式

1. 类适配器模式

在类适配器模式中,适配器通过继承被适配的类和实现目标接口的方式来实现适配。

// 被适配者类
public class Adaptee {public void specificRequest() {System.out.println("执行被适配者的方法");}
}// 目标接口
public interface Target {void request();
}// 适配器类
public class ClassAdapter extends Adaptee implements Target {public void request() {specificRequest();  // 调用被适配者类的方法}
}

2. 对象适配器模式

在对象适配器模式中,适配器通过持有被适配的对象,并实现目标接口的方式来实现适配。

// 被适配者类
public class Adaptee {public void specificRequest() {System.out.println("执行被适配者的方法");}
}// 目标接口
public interface Target {void request();
}// 适配器类
public class ObjectAdapter implements Target {private Adaptee adaptee;  // 持有被适配者实例public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}public void request() {adaptee.specificRequest();  // 调用被适配者类的方法}
}

3.类适配器模式和对象适配器模式对比

类适配器模式和对象适配器模式是适配器模式的两种常见实现方式,它们在实现上有一些差异和优缺点。

  1. 类适配器模式:

    • 实现方式:通过继承被适配的类并实现目标接口来进行适配。
    • 优点:
      • 可以重写被适配类的方法,实现定制化的适配逻辑。
      • 适配器类可以访问被适配类的成员变量和方法。
    • 缺点:
      • 适配器只能适配单个类,无法适配一个类和它的子类。
      • 适配器类与被适配类紧密耦合,限制了适配器的灵活性。
  2. 对象适配器模式:

    • 实现方式:通过持有被适配的对象,并实现目标接口来进行适配。
    • 优点:
      • 适配器可以适配多个不同的被适配类,灵活性较高。
      • 适配器类与被适配类解耦,使得适配器更加独立,易于复用。
    • 缺点:
      • 无法重写被适配类的方法,只能通过调用被适配类的方法来实现适配逻辑。

总结:

  • 类适配器模式适合于需要重写被适配类的方法,或者只适配一个类且希望能直接访问被适配类的成员变量和方法。
  • 对象适配器模式适合于适配多个不同的被适配类,或者希望适配器与被适配类解耦,提供更高的灵活性和复用性。

四、适配器模式应用场景

1. 继承与接口的适配

  • 在已有类上添加适配器:当已有类实现了某个接口的部分方法,但又无法满足其他接口的实现要求时,可以通过适配器继承已有类并实现目标接口的方式来适配。
  • 接口适配器模式:当一个接口拥有多个方法,而我们只需要实现其中的部分方法时,可以通过接口适配器模式解决。

2. 跨平台适配

跨平台适配是适配器模式的常见应用场景之一。通过适配器模式,可以实现不同平台之间的兼容性,使得代码具备可移植性和跨平台性。

五、适配器模式与其他设计模式关系

1. 适配器模式与装饰器模式的区别与联系

适配器模式和装饰器模式都属于结构型设计模式,但它们的作用和用途不同。

  • 适配器模式主要用于接口兼容和转换,使得原本不兼容的类能够协同工作。
  • 装饰器模式主要用于给对象动态添加额外的行为或责任。

2. 适配器模式与桥接模式的区别与联系

适配器模式和桥接模式也有相似之处,但两者的设计意图和应用场景不同。

  • 适配器模式用于将一个类的接口转换成另一个客户端所期望的接口,解决接口不兼容的问题。
  • 桥接模式用于将抽象部分与实现部分分离,使它们可以独立变化。

六、总结

适配器模式是一种常用的设计模式,用于解决接口不兼容的问题。通过类适配器和对象适配器两种实现方式,可以将不兼容的接口转换为可兼容的接口,并提供额外的逻辑处理。在实际开发中,适配器模式具有重要的应用价值,可以提高代码的复用性和灵活性。

相关文章:

设计模式-适配器

文章目录 一、简介二、适配器模式基础1. 适配器模式定义与分类2. 适配器模式的作用与优势3.UML图 三、适配器模式实现方式1. 类适配器模式2. 对象适配器模式3.类适配器模式和对象适配器模式对比 四、适配器模式应用场景1. 继承与接口的适配2. 跨平台适配 五、适配器模式与其他设…...

C. Queries for the Array - 思维

分析: 分析出现矛盾的地方,也就是可能遇到0,并且已有字符串的长度小于等于1,另一种情况就是,遇到了1并且已有字符串不是排好序的,或者遇到了0已有字符串是排好序的,那么可以遍历字符串&#xff…...

音频——硬件拓扑

文章目录 硬件拓扑I2S 数据通路五线模式四线模式两线 TX两线 RX 典型应用硬件连接数据流 硬件拓扑 控制路径:UART/I2C/SPI数据路径:I2S 简略图如下 I2S 数据通路 五线模式 四线模式 两线 TX 两线 RX 典型应用 硬件连接 控制信号:SPI 用…...

Oracle表索引查看方法总结(查看oracle表索引)

Oracle表索引查看方法总结 Oracle是当前应用最广泛的关系数据库,也是多数大型企业使用的数据库。Oracle表索引在提高查询效率方面起着至关重要的作用,掌握该方法也是技术人员必备技能之一。本文总结了几种常见的查看Oracle表索引信息的方法,…...

react css 污染解决方法

上代码 .m-nav-bar {background: #171a21;.content {height: 104px;margin: 0px auto;} }import React from "react"; import styles from ./css.module.scssexport default class NavBar extends React.Component<any, any> {constructor (props: any) {supe…...

volatile 关键字 与 CPU cache line 的效率问题

分析&回答 Cache Line可以简单的理解为CPU Cache中的最小缓存单位。目前主流的CPU Cache的Cache Line大小都是64Bytes。假设我们有一个512字节的一级缓存&#xff0c;那么按照64B的缓存单位大小来算&#xff0c;这个一级缓存所能存放的缓存个数就是512/64 8个。具体参见下…...

又一关键系统上线,理想车云和自动驾驶系统登陆OceanBase

8 月 1 日&#xff0c;理想汽车公布 7 月交付数据&#xff0c;理想汽车 2023 年 7 月共交付新车 34,134 辆&#xff0c;同比增长 227.5%&#xff0c;并已连续两个月交付量突破三万。至此&#xff0c;理想汽车 2023 年累计交付量已经达到 173,251 辆&#xff0c;远超 2022 年全年…...

SIEM(安全信息和事件管理)解决方案

什么是SIEM 安全信息和事件管理&#xff08;SIEM&#xff09;是一种可帮助组织在安全威胁危害到业务运营之前检测、分析和响应安全威胁的解决方案&#xff0c;将安全信息管理 (SIM) 和安全事件管理 (SEM) 结合到一个安全管理系统中。SIEM 技术从广泛来源收集事件日志数据&…...

Go 自学:map关联数组

以下代码展示了如何建立一个map。 我们可以使用delete删除map中的元素。 我们还可以使用loop遍历map中的所有元素。 package mainimport ("fmt" )func main() {languages : make(map[string]string)languages["JS"] "Javascript"languages[&qu…...

c#多态(override)的使用

方法重写&#xff08;override&#xff09;:多态&#xff0c;通过父类类型对象&#xff0c;调用子类当中对应方法的实现。 细节&#xff1a;子类当中的override方法会“抹杀”父类当中对应virtual方法 不使用多态时&#xff0c;父类调用子类方法时&#xff0c;会调用父类的方法…...

kafka 动态扩容现有 topic 的分区数和副本数

文章目录 [toc]创建一个演示 topic生产一些数据使用消费者组消费数据增加分区无新数据产生&#xff0c;有旧数据未消费有新数据产生&#xff0c;有旧数据未消费 增加副本创建 json 文件使用指定的 json 文件增加 topic 的副本数使用指定的 json 文件查看 topic 的副本数增加的进…...

【数据结构】Golang 实现单链表

概念 通过指针将一组零散的内存块串联在一起 &#xff0c; 把内存块称为链表的“结点”。 记录下个结点地址的指针叫作后继指针 next &#xff0c;第一个结点叫作头结点&#xff0c;把最后一个结点叫作尾结点 。 代码实现 定义单链表 在 golang 中可以通过结构体定义单链表…...

云服务器利用Docker搭建sqli-labs靶场环境

一、安装宝塔面板 使用xshell、electerm、SecureCRT等远程终端连接登陆上云服务器&#xff0c;在Linux宝塔面板使用脚本安装 安装后&#xff0c;如下图&#xff1a;按照提示&#xff0c;在云服务器防火墙/安全组放行Linux宝塔面板的端口 在浏览器打开上述网址&#xff0c;登…...

jQuery成功之路——jQuery介绍和jQuery选择器概述

一、jQuery介绍 1.1 jQuery概述 jQuery的概述 jQuery是一个快速、简洁的JavaScript框架。jQuery设计的宗旨是“write Less&#xff0c;Do More”&#xff0c;即倡导写更少的代码&#xff0c;做更多的事情。JQuery封装了JavaScript常用的功能代码&#xff0c;提供了一套易于使…...

极限五分钟,在宝塔中用 Docker 部署升讯威在线客服系统

最近客服系统成功经受住了客户现场组织的压力测试&#xff0c;获得了客户的认可。 客户组织多名客服上线后&#xff0c;所有员工同一时间打开访客页面疯狂不停的给在线客服发消息&#xff0c;系统稳定无异常无掉线&#xff0c;客服回复消息正常。消息实时到达无任何延迟。 本文…...

Java--静态字段与静态方法

1、静态字段 如果将一个字段定义为static&#xff0c;每个类只有一个这样的字段。而对于非静态的实例字段&#xff0c;每个对象都有自己的一个副本。 例如&#xff1a; class Employee {private static int nextId 1;private int id;... }其中&#xff0c;每一个Employee对…...

多线程的五种“打开”方式

1 概念 1.1 线程是什么&#xff1f;&#xff1f; 线程&#xff08;Thread&#xff09;是计算机科学中的一个基本概念&#xff0c;它是进程&#xff08;Process&#xff09;中的一个执行单元&#xff0c;负责执行程序的指令序列。线程是操作系统能够进行调度和执行的最小单位。…...

信息熵 条件熵 交叉熵 联合熵 相对熵(KL散度) 互信息(信息增益)

粗略版快速总结 条件熵 H ( Q ∣ P ) 联合熵 H ( P , Q ) − H ( P ) 条件熵H(Q∣P)联合熵H(P,Q)−H(P) 条件熵H(Q∣P)联合熵H(P,Q)−H(P) 信息增益 I ( P , Q ) H ( P ) − H ( P ∣ Q ) H ( P ) H ( Q ) − H ( P , Q ) 信息增益 I(P,Q)H(P)−H(P∣Q)H(P)H(Q)-H(P,Q) 信息…...

Fiddler Response私人订制

在客户端接口的测试中&#xff0c;我们经常会需要模拟各种返回状态或者特定的返回值&#xff0c;常见的是用Fiddler模拟各种请求返回值场景&#xff0c;如重定向AutoResponder、请求拦截修改再下发等等。小编在近期的测试中遇到的一些特殊的请求返回模拟的测试场景&#xff0c;…...

【德哥说库系列】-ASM管理Oracle 19C单实例部署

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

【Vue】scoped+组件通信+props校验

【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性&#xff0c; 令样式只作用于当前组件的标签 作用&#xff1a;防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…...

【前端实战】如何让用户回到上次阅读的位置?

目录 【前端实战】如何让用户回到上次阅读的位置&#xff1f; 一、总体思路 1、核心目标 2、涉及到的技术 二、实现方案详解 1、基础方法&#xff1a;监听滚动&#xff0c;记录 scrollTop&#xff08;不推荐&#xff09; 2、Intersection Observer 插入探针元素 3、基…...