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

适配器模式-java实现

意图

复用已经存在的接口,与所需接口不一致的类。即将一个类(通常是旧系统中的功能类),通过适配器转化成另一个接口的实现。(简单来说,就是复用旧系统的功能,去实现新的接口)

我们举一个框架中使用的例子:springMVC中的dispatchServlet中,执行流程是先获取请求对应的映射方法全类名,然后找到该方法对应的适配器,这就是适配器模式的使用,因为springMVC需要执行方法后,返回一个ModelAndView对象。但是我们直接反射执行方法,是返回不了这个对象的,这就需要适配器模式上场帮我们去适配返回一个ModelAndView了。

我们举个生活中的例子:

适配器模式将一个类的程序设计接口转换成另一个接口术这很像变压器把一种电压变换成另一种电压。例如,美国的生活用电电压是110 V,而中国的电压是220 V。如果要在中国使用美国电器,就必须有一个能把220 V电压转换成110 V电压的变压器,这个变压器就是一个Adapter。

从下面两个图片我们可以知道适配器模式的本意:我们可以这样理解,220V插座提供的功能是220v供电的功能,任何电器只需要供电就能正常运作。美国电器同样需要供电,但是供电的类型有点特殊,需要110v的供电,但是我们项目中只有220v的接口,那么就需要一个转换,这个转换器就是我们后来所说的适配器,即Adapter。

那么美国电器,就是新的功能规范,需要的功能类型和旧接口是一致的,只是不能直接使用旧接口,所以需要适配器去对旧接口进行转换操作

原本中国的电器使用

 

使用变压器后的美国电器使用

 

类图描述

类的适配器模式结构

通过继承来实现可用的类结构

可以看出,Adaptee类没有Request方法(其实不算没有,Adaptee中的不能直接适配Request的功能),而客户期待这个方法。为了使客户能够使用Adaptee类,需要提供一个中间环节,即Adapter类,Adapter类实现了Target接口,并继承自Adaptee,Adapter类的Request方法重新封装了Adaptee的SpecificRequest方法,实现了适配的目的。因为Adapter与Adaptee是继承的关系,所以这决定了这个适配器模式是类的。

 

适配器模式涉及以下角色:

(1)目标(Target)角色: 是客户所期待的接口。因为java不支持多继承,所以Target必须是接口,不可以是类。

(2)源(Adaptee): 需要适配的类,也就是旧系统中已经有的类。

(3)适配器(Adapter)角色: 把源接口转换成目标接口,这一角色必须是类。

 

 

 请注意:适配器模式的要点是,新的目标接口所需要的功能跟旧接口的一致,但是又有一些差别,因此需要适配器Adapter来进行转换处理,而不是添加新的接口等,切勿跟装饰模式搞混了。

对象的适配器结构

跟类的适配器结构区别在于,Adapter中保持了一个旧的对象的引用,而不是通过继承来实现

 

例子:

假设目前有一个日期的工具类对象PersonDate,返回的内容是当前的时间戳,而此时,用户希望得到(年-月-日),也就是年月日这样类型的,于是这个新的规范,抽象为一个接口UserDate

首先创建PersonDate类

public class PersonDate {//返回当前日期的时间戳public Long getNowDate(){Date date=new Date();return date.getTime();}
}

然后创建新接口UserDate

public interface UserDate {//返回当前日期的格式化内容  年-月-日String getNowDateString();
}

创建适配器AdapterDate,这里采用对象适配器的方式,在适配器中保留旧对象的引用

public class AdapterDate implements UserDate{//保持旧实例的引用private PersonDate personDate;public AdapterDate(PersonDate personDate) {this.personDate = personDate;}//具体的转换方法@Overridepublic String getNowDateString() {//获取时间戳Long nowDate = personDate.getNowDate();//转化成date对象Date date=new Date(nowDate);SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");String dateString = format.format(date);return dateString;}
}

客户端测试:

public class Client {public static void main(String[] args) {//客户端使用旧的接口PersonDate personDate=new PersonDate();System.out.println(personDate.getNowDate());//使用适配器对象UserDate userDate=new AdapterDate(personDate);System.out.println(userDate.getNowDateString());}
}

运行结果:

 

 

小结:

到这里,我们可以知道适配器模式的理念,就是复用旧系统中的功能类,去适配新的接口,而新的接口,恰好需要和旧系统中对象相同的功能(不完全相同,但是大体一致),这时候就需要适配器去将旧功能对象去转化成为新接口的实现

相关文章:

适配器模式-java实现

意图 复用已经存在的接口,与所需接口不一致的类。即将一个类(通常是旧系统中的功能类),通过适配器转化成另一个接口的实现。(简单来说,就是复用旧系统的功能,去实现新的接口) 我们举…...

【elasticSearch系】3.完整搭建详尽版elk

话不多说,我们先看下经典的elk 是由哪些组件搭建组合起来的 elasticsearch和kibana搭建 可以查看之前我们搭建elasticsearch和kibana 的这篇文章 logstash搭建 为了和之前我们搭建elasticsearch和kibana版本保持一致,这里我们还是选择7.17.3 下载地址 点击下载,这里为了…...

代码随想录day04

24. 两两交换链表中的节点 ● 力扣题目链接 ● 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 ● 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 思路 ● 使用迭代的方法,分析交换逻辑即可 ○ …...

[Realtek] WPA_SUPPLICANT + WPA_CLI使用指南

开启wpa_supplicant wpa_supplicant –Dnl80211 -iwlan0 -c ./wpa.conf –B 或者 wpa_supplicant -Dwext -iwlan0 -c ./wpa.conf -B 扫描AP wpa_cli -p/var/run/wpa_supplicant scan 查看AP扫描结果 wpa_cli -p/var/run/wpa_supplicant scan_results 连接到热点 OPEN…...

# ⛳ Docker 安装、配置和详细使用教程-Win10专业版

目录 ⛳ Docker 安装、配置和详细使用教程-Win10专业版🚜 一、win10 系统配置🎨 二、Docker下载和安装🏭 三、Docker配置🎉 四、Docker入门使用 ⛳ Docker 安装、配置和详细使用教程-Win10专业版 🚜 一、win10 系统配…...

Linux 教程

目录 Linux 教程 内核引导 运行init 运行级别 系统初始化 Linux 系统目录结构 Linux 教程 Lin...

图论——最短路算法

引入&#xff1a; 如上图&#xff0c;已知图G。 问节点1到节点3的最短距离。 可心算而出为d[1,2]d[2,3]112,比d[1,3]要小。 求最短路径算法&#xff1a; 1.Floyd(弗洛伊德) 是一种基于三角形不等式的多源最短路径算法。边权可以为负数 表现为a[i,j]a[j,k]<a[i,k]。 …...

在项目中增加网络加载需要考虑什么?

1、下载器 网络加载的第一步肯定是下载&#xff0c;那么选择一个合适的下载器是十分重要的&#xff0c;这个下载器最好支持什么功能&#xff1f; 多线程下载&#xff08;同时需要服务端支持&#xff0c;下载时可指定range&#xff09; 断点续传 通用性&#xff08;其他位置也…...

阿里云服务器部署RabbitMQ流程

阿里云百科分享使用阿里云服务器部署RabbitMQ流程&#xff0c;RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff0c;用于在分布式系统中存储转发消息&#xff0c;有良好的易用性、扩展性和高可用性。本文介绍如何通过ECS实例部署Rabbi…...

青大数据结构【2014】

一、单选 二、简答 为了解决顺序队列的假溢出问题&#xff0c;提出了循环队列&#xff0c;即把存储队列的表从逻辑上看成一个环 判别队列空和满有三种方法&#xff1a; 1&#xff09;采用计数器判别&#xff0c;空时&#xff0c;计数器为0&#xff1b;满时&#xff0c;计数器…...

Ansible Playbook快速部署一主多从MySQL集群

部署目标&#xff1a; 1、快速部署一套一主两从的mysql集群 2、部署过程中支持交互式定义安装目录及监听端口号 部署清单目录结构&#xff1a; rootmaster:/opt/mysql# tree . . ├── group_vars │ └── all.yml ├── hosts ├── mysql.yml └── roles└── mys…...

27.Netty源码之FastThreadLocal

highlight: arduino-light FastThreadLocal FastThreadLocal 的实现与 ThreadLocal 非常类似&#xff0c;Netty 为 FastThreadLocal 量身打造了 FastThreadLocalThread 和 InternalThreadLocalMap 两个重要的类。下面我们看下这两个类是如何实现的。 FastThreadLocalThread 是对…...

linux下离线安装docker

linux下离线安装docker 一、安装docker Docker 官网离线安装文档 https://docs.docker.com/engine/install/binaries/ 整理步骤如下&#xff1a; 官网下载 docker 安装包&#xff0c;地址为 https://download.docker.com/linux/static/stable/&#xff0c;如果是x86就选择x…...

SQL server 异地备份数据库

异地备份数据库 1.备份服务器中设置共享文件夹 2.源服务器数据库中添加异地备份代理作业 EXEC sp_configure show advanced options, 1;RECONFIGURE; EXEC sp_configure xp_cmdshell, 1;RECONFIGURE; declare machine nvarchar(50) 192.168.11.10 --服务器IP declare pa…...

高并发系统设计要点

在系统设计时&#xff0c;如果能预先看到一些问题&#xff0c;并在设计层面提前解决&#xff0c;就会给后期的开发带来很大的便捷。相反&#xff0c;有缺陷的架构设计可能会导致后期的开发工作十分艰难&#xff0c;甚至会造成“推倒重来”的情形。因此&#xff0c;在系统设计阶…...

Redis 拒绝服务漏洞(CVE-2023-28856)修复处理

一、漏洞描述 Redis Labs Redis是美国Redis Labs公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值&#xff08;Key-Value&#xff09;存储数据库&#xff0c;并提供多种语言的API。 Redis 7.0.0 到 7.0.10版本、6.2.0 到 6.2.11版本、6.0.0 到 …...

Android保存网页的方法

首先要使用js交互就需要懂原理&#xff1a; 感谢大佬&#xff1a;js中document节点获取页面元素的六种方式 1.querySelector()方法 描述&#xff1a;本方法用于根据给定的选择器选中页面元素 如果有多个元素满足条件&#xff0c;则返回第一个满足条件的元素节点 语法&#xff…...

P2P 网络,PING程序。

没有废话,直接上版本号和代码,以及讲解。 crate版本号libp2p0.52.1tokio1.30.0依赖配置: [dependencies] tokio = { version="1.30.0", features=["full"] } libp2p = { version="0.52.1", features=["tokio","dns", &q…...

OPENCV C++(十二)模板匹配

正常模板匹配函数 matchTemplate(img, templatee, resultMat, 0);//模板匹配 这里0代表的是方法&#xff0c;一般默认为0就ok img是输入图像 templatee是模板 resultmat是输出 1、cv::TM_SQDIFF&#xff1a;该方法使用平方差进行匹配&#xff0c;因此最佳的匹配结果在结果为…...

【配置环境】Linux下安装MySQL

目录 一&#xff0c;环境 二&#xff0c;安装步骤 1.使用包管理器安装MySQL 2.配置MySQL的安全选项 3.设置root用户使用密码进行身份验证&#xff08;可选&#xff09; 三&#xff0c;拓展知识 1.如何修改MySQL的密码策略&#xff1f; 一&#xff0c;环境 VMware Workst…...

手机号逆向查询QQ号:3步快速查询完整指南

手机号逆向查询QQ号&#xff1a;3步快速查询完整指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否遇到过需要查找手机号对应QQ号的困扰&#xff1f;手机号逆向查询工具正是为解决这一实际问题而设计的Python开源工具。这个…...

终极指南:5个技巧掌握免费开源字体Bebas Neue的设计应用

终极指南&#xff1a;5个技巧掌握免费开源字体Bebas Neue的设计应用 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue Bebas Neue是全球最受欢迎的免费开源字体之一&#xff0c;自2005年诞生以来已成为设计师和开发…...

FPGA实战:手把手教你用DDS生成1MHz正弦波(附完整代码)

FPGA实战&#xff1a;从零构建1MHz正弦波发生器的工程指南 在数字信号处理领域&#xff0c;直接数字频率合成&#xff08;DDS&#xff09;技术因其高精度、快速切换和灵活配置的特性&#xff0c;已成为现代电子系统中的核心技术之一。本文将带领FPGA初学者和需要快速实现DDS功能…...

【免费降AI教程】论文降AIGC工具怎么选?实测DeepSeek等10款软件,手把手教你零成本降AI率

说起来都是泪&#xff0c;上个月我交毕业论文的时候&#xff0c;明明自己一个字一个字敲出来的&#xff0c;结果一检测&#xff0c;AI率居然飙到73%&#xff01;当时距离截止日期只剩三天&#xff0c;导师还在催稿&#xff0c;那种绝望的感觉现在想起来还心有余悸。 这一个多月…...

从科幻小说到产品设计:如何用‘What-If’思维模型,提前5年预判技术趋势

科幻思维解码&#xff1a;用未来叙事重构产品创新逻辑 当科幻遇见产品&#xff1a;一场跨越时空的思维实验 1982年上映的《银翼杀手》描绘了2019年的洛杉矶街头全息广告与仿生人共存的世界&#xff0c;这个曾被视作天方夜谭的设定&#xff0c;如今在增强现实技术和人形机器人领…...

Docker 27调度器源码级解读(commit #a7f2e1d):为什么你的Llama-3-70B容器总被错误kill?

第一章&#xff1a;Docker 27调度器架构演进与Llama-3-70B容器异常终止现象综述Docker 27 引入了重构后的容器调度器&#xff08;Scheduler v2&#xff09;&#xff0c;其核心从原先基于事件轮询的同步调度模型&#xff0c;转向基于 CRD&#xff08;Custom Resource Definition…...

不止于错误捕获:深入Tcl的catch命令,玩转break、continue和return的异常流

深入解析Tcl的catch命令&#xff1a;掌控脚本流程的终极武器 在Tcl脚本编程中&#xff0c;异常处理是构建健壮应用程序的关键。大多数开发者对catch命令的理解停留在简单的错误捕获层面&#xff0c;却忽略了它作为流程控制枢纽的强大潜力。本文将带你重新认识这个被低估的语言特…...

物联网物模型原理与2026年行业现状

对于物联网架构&#xff0c;一般分为云、管、端三部分&#xff0c;“端”可以简单的指设备、传感器&#xff0c;“云”一般指应用平台&#xff0c;而“管”就是指物联网平台&#xff0c;物联网平台的作用就是承上启下&#xff0c;向下接入各种不同类型的设备&#xff0c;向上提…...

全栈编程基础知识1

全栈编程基础知识1 1.Java和mybatis 1.Java三大特性 - 封装:将自然界的对象封装为Java对象,属性私有化表示 - 继承:子类继承父类,extend继承 - 多态:同一个动作,不同的对象表现不同 2.==和equals对比 一个是比较的值,一个是比较的地址 3.string stringbuilder s…...

Phi-3.5-mini-instruct实战案例:Gradio ChatInterface多模态扩展预留接口

Phi-3.5-mini-instruct实战案例&#xff1a;Gradio ChatInterface多模态扩展预留接口 1. 项目概述 Phi-3.5-mini-instruct是微软推出的轻量级开源指令微调大模型&#xff0c;在长上下文代码理解&#xff08;RepoQA&#xff09;、多语言MMLU等基准测试中表现优异&#xff0c;显…...