设计模式篇(Java):适配器模式

设计模式篇(Java):建造者模式

八、适配器模式

8.1 适配器模式基本介绍

生活中的适配器例子

  • 比如生活中的插座,在不同国家插座有着不同的规格,如果我们从一个国家去另外一个国家需要使用插座时就需要一个中间转换器把两种不同规则的插座适配一下。
  • 生活中电脑充电器,手机充电器,手机电脑可能支持20v充电,但是生活用电时220v,所以产家加载充电器上做了适配器,把插座过来的220v适配成手机能适应的20v

基本介绍

  • 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。
  • 适配器模式属于结构型模式。
  • 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式

工作原理

  • 适配器模式:将一个类的接口转换成另一种接口。让原本接口不兼容的类可以兼容。
  • 从用户的角度看不到被适配者,是解耦的。
  • 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法。
  • 用户收到反馈结果,感觉只是和目标接口交互。用户感受不到适配的过程。

8.2 类适配器模式

生活示例:充电器。充电器本身相当于Adapter,220V交流电相当于src(即被适配者),我们的目dst(即目标)是20V直流电。

在这里插入图片描述

代码示例

被适配的类(220V)

/*** @author cVzhanshi* @create 2023-06-25 16:33*/@Slf4j
public class Voltage220V {public int output220V() {int src = 220;log.info("电压 = {}V", src);return src;}
}

适配接口

/*** @author cVzhanshi* @create 2023-06-25 16:35*/
public interface IVoltage5V {int output5V();
}

适配类

/*** @author cVzhanshi* @create 2023-06-25 16:36*/
public class VoltageAdapter extends Voltage220V implements IVoltage5V{@Overridepublic int output5V() {// 获得220v电压int src = output220V();// 转化成手机能用的5vint dst = src / 44;return dst;}
}

手机类以及客户端

/*** @author cVzhanshi* @create 2023-06-25 16:38*/
@Slf4j
public class Phone {// 充电public void init (IVoltage5V iVoltage5V) {if (iVoltage5V.output5V() == 5) {log.info("电压为5v,可以充电");} else {log.info("电压大于5v,不能充电");}}
}/*** @author cVzhanshi* @create 2023-06-25 16:40*/
public class Client {public static void main(String[] args) {Phone phone = new Phone();phone.init(new VoltageAdapter());}
}

这样就是通过适配器解决了电压不适配的问题

类适配器模式注意事项和细节

  • Java是单继承机制,所以类适配器需要继承被适配类这一点算是一个缺点,因为这要求dst必须是接口,有一定局限性。
  • src类的方法在Adapter中都会暴露出来,也增加了使用的成本。
  • 由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了。

8.3 对象适配器模式

  • 与类适配器唯一不同的是,对象适配器模式是持有src类,而不是继承src类。
  • 使用了关联或者聚合的关系代替了继承

那么类图就变成了

在这里插入图片描述

代码主要是适配器代码的区别:

适配器

/*** @author cVzhanshi* @create 2023-06-25 16:36*/
public class VoltageAdapter extends Voltage220V implements IVoltage5V{private Voltage220V voltage220V;public VoltageAdapter (Voltage220V voltage220V) {this.voltage220V = voltage220V;}@Overridepublic int output5V() {// 获得220v电压int src = voltage220V.output220V();// 转化成手机能用的5vint dst = src / 44;return dst;}
}

对象适配器的注意事项和细节

  • 组合代替了继承,解决了类适配器需要继承src的局限性,也不需要要求dst必须是接口。

  • 使用成本低,更灵活。

8.4 接口适配器模式

  • 接口适配器模式也可以称为缺省适配器模式
  • 核心思路:当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法), 那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求
  • 适用于一个接口不想使用其所有的方法的情况。

代码演示

接口

public interface IVoltage {void output5V();void output10V();void output15V();void output20V();
}

适配器

/*** @author cVzhanshi* @create 2023-06-25 17:08*/
public abstract class Adapter implements IVoltage{@Overridepublic void output5V() {}@Overridepublic void output10V() {}@Overridepublic void output15V() {}@Overridepublic void output20V() {}
}

然后使用者再根据需求重写某些方法就可以

8.5 适配器模式在SpringMVC中的运用

在DispatcherServlet类中

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {HttpServletRequest processedRequest = request;HandlerExecutionChain mappedHandler = null;boolean multipartRequestParsed = false;WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);// ...ModelAndView mv = null;Exception dispatchException = null;processedRequest = checkMultipart(request);multipartRequestParsed = (processedRequest != request);// Determine handler for the current request.// 确定当前请求的处理程序,根据request来获取HandlermappedHandler = getHandler(processedRequest);if (mappedHandler == null) {noHandlerFound(processedRequest, response);return;}// Determine handler adapter for the current request.// 确定当前请求的处理程序适配器 根据handler来获取适配器HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());// ...// Actually invoke the handler.// 实际上调用处理程序mv = ha.handle(processedRequest, response, mappedHandler.getHandler());// ...processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);}

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

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

相关文章

Spring Security系列之基础概念

文章目录 基本原理Authentication接口UserDetailsService 接口PasswordEncoder 接口EnableWebSecurity 注解 基本原理 SpringSecurity 本质是一个过滤器链,采用的是责任链设计模式。 启动的时候,控制台打印出来的 DefaultSecurityFilterChain 过滤器&…

openfeign实现远程调用

一 openfeign简介 Feign 是声明性(注解)web 服务客户端它使编写 web 服务客户端更加容易请创建一个接口并对其进行注解.它具有可插入注解支持,包括Feign注解和JAXRS注解Feign 还支持可插拔编码器和解码器。Spring cloud 添加了对Spring MVC注解的支持,并…

GPT-4 参加2023年高考数学,人工智能对话机器人和人类对决,快谁速度快

ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定 让ChatGPT帮你高效实现职场办公!行动起来吧。 【点击查看更多知识】ChatGPT从入门到精通&am…

使用SSH远程直连Docker容器

文章目录 1. 下载docker镜像2. 安装ssh服务3. 本地局域网测试4. 安装cpolar5. 配置公网访问地址6. SSH公网远程连接测试7.固定连接公网地址8. SSH固定地址连接测试 转载自cpolar极点云文章:SSH远程直连Docker容器 在某些特殊需求下,我们想ssh直接远程连接docker 容器…

【STM32智能车】电机控制

【STM32智能车】电机控制 PWMPWM基本用法: 电机驱动基本控制基本状态 欢迎收看由咸鱼菌工作室出品的STM32系列教程。本篇内容主要电机控制 PWM 我们要控制电机,就要先了解一下PWM。 PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通…

2022前端趋势报告(下)

前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~ 主页: oliver尹的主页 格言: 跌倒了爬起来就好~ 一、前言 本文内容来自于《St…

go 调试利器之pprof指标分析

文章目录 概要一、指标类型1.1、堆栈指标1.2、CPU指标分析1.3、http-pprof 二、go tool pprof2.1、可视化2.2、CPU火焰图 概要 Go语言原生支持对于程序运行时重要指标或特征进行分析。pprof是其中一种重要的工具,其不仅可以分析程序运行时的错误(内存泄…

html5前端学习2

一篇思维题题解: 第五周任务 [Cloned] - Virtual Judge (vjudge.net) http://t.csdn.cn/SIHdM 快捷键: CtrlAltDown 向下选取 CtrlAltUp 向上选取(会出现多个光标,可以同时输入) CtrlEnter …

24个Jvm面试题总结及答案

1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每…

html实现多种风格的时间轴(附源码)

文章目录 1.设计来源1.1 对称风格时间轴1.2 横向风格时间轴1.3 回忆风格时间轴1.4 记事风格时间轴1.5 简易风格时间轴1.6 科技风格时间轴1.7 列表风格时间轴1.8 跑道风格时间轴1.9 人物风格时间轴1.10 容器风格时间轴1.11 沙滩风格时间轴1.12 双边风格时间轴1.13 图文风格时间轴…

基于原生 js 实现今日新闻网站

完整资料进入【数字空间】查看——baidu搜索"writebug" 一、今日新闻网站设计报告 1.1 1 设计思路 该网站设计大部分都是基于原生 js 实现。基本思想为首先将基本的页面架构包括 header,导航条写好。之后根据后台 PHP 请求接口请求返回 JSON 格式数据后…

【Linux 系统编程】Linux背景介绍 及 基本指令详解(一)

文章目录 1. Linux背景1.1 发展史1.2 开源精神1.3 官网1.4 企业应用现状1.5 发行版本1.6 os概念,定位 2. Linux下基本指令2.1 几个常用基本命令演示2.2 某些概念的解释2.3 ls 指令2.4 pwd 指令2.5 cd 指令Linux的目录结构绝对路径与相对路径cd 常用快捷命令 2.6 tou…