Java设计模式-结构型-适配器模式

Java设计模式-结构型-适配器模式

本文我们简单说下设计模式中的适配器模式。

一、概述

​ 与电源适配器相似,在适配器模式中引入了一个被称为适配器(Adapter)的包装类,而它所包装的对象称为适配者(Adaptee),即被适配的类。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器让那些由于接口不兼容而不能交互的类可以一起工作。

适配器模式可以将一个类的接口和另一个类的接口匹配起来,而无须修改原来的适配者接口和抽象目标类接口。适配器模式定义如下:

适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

所以,适配器模式比较适合以下场景:

  • (1)系统需要使用现有的类,而这些类的接口不符合系统的接口。
  • (2)使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

二、实现方式

对象适配器模式和类适配器模式

在这里插入图片描述

  • 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
  • 需要适配的类(Adaptee):需要适配的类或适配者类。
  • 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

类适配器

在类适配器模式中,适配器与适配者之间是继承(或实现)关系。

  • 目标接口
/*** @author yuanhewei* @date 2024/2/18 17:44* @description*/
public interface Target {/*** 请求*/void request();
}
  • 具体实现类
/*** @author yuanhewei* @date 2024/2/18 18:00* @description*/
public class ConcreteTarget implements Target {@Overridepublic void request() {System.out.println("类适配器-ConcreteTarget: 普通的实现类,具有普通的功能!");}
}
  • 适配者
/*** @author yuanhewei* @date 2024/2/18 17:45* @description*/
public class Adaptee {public void specificRequest() {System.out.println("类适配器-Adaptee: 需要被适配器包装的具有特殊功能的类!");}
}
  • 适配器
/*** @author yuanhewei* @date 2024/2/18 17:45* @description*/
public class Adapter extends Adaptee implements Target{@Overridepublic void request() {super.specificRequest();}
}
  • 测试代码
/*** @author yuanhewei* @date 2022-02-17 20:11*/
@SpringBootTest
class ClassAdapterTest {@Testvoid testClassAdapter() {Target adapter = new Adapter();adapter.request();Target concreteTarget = new ConcreteTarget();concreteTarget.request();}
}

对象适配器

在对象适配器模式中,适配器与适配者之间是关联关系。

  • 目标接口
/*** @author yuanhewei* @date 2024/2/18 17:44* @description*/
public interface Target {/*** 请求*/void request();
}
  • 具体实现类
/*** @author yuanhewei* @date 2024/2/18 18:00* @description*/
public class ConcreteTarget implements Target {@Overridepublic void request() {System.out.println("类适配器-ConcreteTarget: 普通的实现类,具有普通的功能!");}
}
  • 适配者
/*** @author yuanhewei* @date 2024/2/18 17:45* @description*/
public class Adaptee {public void specificRequest() {System.out.println("类适配器-Adaptee: 需要被适配器包装的具有特殊功能的类!");}
}
  • 适配器
/*** @author yuanhewei* @date 2024/2/18 17:45* @description*/
@Service
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}
  • 测试代码
/*** @author yunehewei* @date 2022-02-17 20:11*/
@SpringBootTest
class ObjectAdapterTest {@Testvoid testObjAdapter() {// 适配器Target adapter = new Adapter(new Adaptee());adapter.request();// 具体实现类Target concreteTarget = new ConcreteTarget();concreteTarget.request();}
}

从上面的代码可以看出,适配器必须有一个被适配的类的对象,然后通过Adapter适配器,把具有具体特殊的功能交给这个对象去实现。

在使用适配器模式时,可以使Adapter适配器通过传入的不同的Adaptee对象,实现多个不同的被适配的类的功能。当然,此时我们可以为多个被适配类提取出一个接口或抽象类。这样看起来的话,似乎对象适配器模式更加灵活一点。

参考

  • https://blog.csdn.net/lovelion/article/details/8624325
  • https://blog.csdn.net/a745233700/article/details/83628122

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

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

相关文章

【DDD】学习笔记-深入理解简单设计

测试驱动开发遵守了测试—开发—重构的闭环。测试设定了新功能的需求期望,并为功能实现提供了保护;开发让实现真正落地,满足产品功能的期望;重构则是为了打磨代码质量,降低软件的维护成本。期望—实现—改进的螺旋上升…

【力扣每日一题】力扣889根据前序和后续遍历构造二叉树

题目来源 力扣889根据前序和后续遍历构造二叉树 题目概述 给定两个整数数组,preorder 和 postorder ,其中 preorder 是一个具有 无重复 值的二叉树的前序遍历,postorder 是同一棵树的后序遍历,重构并返回二叉树。 如果存在多个…

基于springboot+vue的桂林旅游景点导游平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Qt应用软件【协议篇】QtHttpServer三方库的编译、安装、使用示例

文章目录 1.Qt HTTP Server 简介2.主要功能和使用场景3.限制和安全性4.使用模块5.代码下载、编译与安装6.QtHttpServer代码示例1.Qt HTTP Server 简介 Qt HTTP Server 是一个轻量级的 HTTP 服务器,它允许在Qt应用程序中构建HTTP服务器功能。这个库主要用于将应用程序功能通过…

Spring Security 重点解析

Spring Security 重点解析 文章目录 Spring Security 重点解析1. 简介2. 依赖3. 登录认证3.1 登录校验流程3.2 Spring Security 默认登录的原理3.2.1 Spring Security 完整流程3.2.2 登录逻辑探究 3.3 自定义改动3.3.1 自定义用户密码校验3.3.2 自定义 UserDetails 获取方式 F1…

nginx的正向代理和反向代理

正向代理 正向代理是指客户端通过代理服务器访问互联网资源。客户端发送请求到代理服务器,然后由代理服务器代为向互联网资源服务器发送请求,并将响应返回给客户端。在这种情况下,互联网资源服务器并不知道请求的真实发起者是谁,…

基于Spring Boot的安康旅游网站的设计与实现,计算机毕业设计(带源码+论文)

源码获取地址: 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1760645517548793858

SpringSecurity + OAuth2 详解

SpringSecurity入门到精通 ************************************************************************** SpringSecurity 介绍 **************************************************************************一、入门1.简介与选择2.入门案例-默认的登录和登出接口3.登录经过了…

不做内容引流,你凭什么在互联网上赚钱?

孩子们放寒假了,待在家里不是看电视,就是拿着手机刷视频,脸上是各种欢快和满足。只是一切换到写作业模式,孩子是各种痛苦表情包,家长则是使出浑身解数,上演亲子大战。可见娱乐常常让人愉悦,而学…

Bluetooth Smart HTTP 代理服务(HTTP Proxy Service,HPS)的实现过程

在 Android 开发中,Bluetooth Smart HTTP 代理服务(HTTP Proxy Service,HPS)的实现通常涉及使用 Bluetooth GATT(通用属性)协议来进行通信。这种代理服务的实现可以让 Bluetooth Smart(低功耗蓝牙)设备通过 HTTP 代理与互联网进行通信。 下面是一个简单的示例框架,展…

cad中的快捷键

切换常规功能 CtrlG切换网格CtrlE循环等轴测平面CtrlF切换执行对象捕捉CtrlH切换拾取样式CtrlShiftH切换隐藏托盘CtrlI切换坐标CtrlShiftI切换推断约束 管理屏幕 Ctrl0(零)全屏显示Ctrl1“特性”选项板Ctrl2“设计中心”选项板Ctrl3“工具”选项板Ctr…

鼠标事件和滚轮事件

1. 介绍 QMouseEvent类用来表示一个鼠标事件,当在窗口部件中按下鼠标或者移动鼠标指针时,都会产生鼠标事件。利用QMouseEvent类可以获知鼠标是哪个键按下了,还有鼠标指针的当前位置等信息。通常是重定义部件的鼠标事件处理函数来进行一些自定…

ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器

ubuntu系统上的软件相比CentOS更新还是比较快的,但是还是难免有一些软件更新得不那么快,比如LLVM Clang编译器,目前ubuntu 22.04版本最高还只能安装LLVM 15,而LLVM 18 rc版本都出来了。参见https://github.com/llvm/llvm-project/…

服务器系统日志在哪里看

查看服务器系统日志的方法取决于您使用的操作系统和服务器类型。以下是一些常见操作系统的查看系统日志的方法 在Windows操作系统中,可以通过“事件查看器”来查看系统日志。首先,点击“开始”菜单,选择“控制面板”,然后点 击“…

【STM32】Keil RTE使用记录

0 前言 最近因为任务需要,再次开始研究STM32,打算过一遍之前记录的笔记,在创建工程模板时,突然发现一个之前被自己忽略的东西,那就是创建项目时会弹出的Run-Time Environment,抱着好奇的心态去找了一些资料…

防御保护--入侵防御系统IPS

目录 DFI和DPI技术 --- 深度检测技术 入侵防御(IPS) 签名 入侵防御策略的配置 内容安全:攻击可能只是一个点,防御需要全方面进行 IAE引擎 DFI和DPI技术 --- 深度检测技术 DPI--深度包检测技术--主要针对完整的数据包&#xff0…

冒泡排序法的名字由来,排序步骤是什么,最坏情况下的排序次数如何计算得来的呢?

问题描述:冒泡排序法的名字由来,排序步骤是什么,最坏情况下的排序次数如何计算得来的呢? 问题解答: 冒泡排序法的名字来源于排序过程中较大的元素会像气泡一样逐渐“冒”到序列的顶端,而较小的元素则会逐…

宝玉:Sora 如何改变我们的生活

以下是宝玉老师接受有关Sora采访以及整理脱水的文字稿,非常值得阅读。 很荣幸受王又又邀请,今天和她以及《宇宙探索编辑部》副导演吕启洋(Ash)一起聊聊了一下当前火爆的话题 Sora,看 Sora 如何改变我们的生活。 我把技…

web前端安全性——XSS跨站脚本攻击

前端Web安全主要涉及保护Web应用程序免受恶意攻击和滥用的过程。攻击者可能会利用Web漏洞来窃取敏感信息、执行未经授权的操作或破坏应用程序。作为前端工程师我们应该了解前端攻击的漏洞有哪些,采用什么方法解决。 跨站脚本攻击(XSS) 1、概…

Object和Function是函数,函数都有一个prototype属性

Object 和 Function 都是 JavaScript 自带的函数对象 在 JavaScript 中,万物皆对象,你要一个吗?new Object() 啊! 当然,就好比同样为人,也区分普通人和天才。 对象也是有分类的,分为 普通对象…