系列二十五、Spring设计模式之适配器模式

一、适配器模式

1.1、概述

       适配器模式(Adapter Pattern)用于兼容不相关的接口之间,类似于一个桥梁,它结合了两个独立接口的功能,这种类型的设计属于结构型模式,为了方便大家伙的理解,我举个例子,例如:国产的电源适配器标准输出电压是220v,美国人购买该电源适配器后显然无法直接使用(美国标准输出电压110v,PS:不怕把电脑充冒烟可以直接使用!),那么这个时候可以使用一个适配器将国产充电器的电压转换为美国标准电压后再进行使用,这是生活中最常见的一个场景 ,类似的场景还有很多,欢迎大家点赞+留言+举例!作为23种设计模式之一的适配器模式(Adapter Pattern),在Java中有着广泛的应用,例如:基于IO流的BufferedInputStream、BufferedOutputStream,基于SpringMVC的各种HandlerAdapter(处理器适配器),那么工作中我们应该怎么使用适配器模式助力开发呢?下面进入实战演示环节

1.2、组成要素

  • Target:客户期望获得的功能(例如:美国人需要110v的电压);
  • Client:客户。通过访问Target接口来获取期望的功能(110v电压);
  • Adaptee:现有接口(例如:当前国产电源适配器的标准输出电压为220v),需要被适配;
  • Adapter:适配器类,适配现有接口使其符合客户需求

        结构图如下:

1.3、思想

        适配器提供和现有接口相同的功能,即输出电压,但是在输出电压时将现有接口注入,然后在适配器实现中对现有接口的功能进行处理,得到预期结果;

1.4、案例代码

1.4.1、项目概览

1.4.2、pom

同 系列二十四、Spring设计模式之策略模式 # pom

1.4.3、ChinaChargerAdaptee

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/30 9:46* @Description: 中国充电器标准输出电压220v*/
public interface ChinaChargerAdaptee {/*** 输出电压* @return*/String outputVoltage();}

1.4.4、ChinaChargerAdapteeImpl

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/30 9:47* @Description:*/
@Component
public class ChinaChargerAdapteeImpl implements ChinaChargerAdaptee {@Overridepublic String outputVoltage() {return "220";}
}

1.4.5、ChargerAdapter

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/30 9:52* @Description: 电源适配器*/
public interface ChargerAdapter {/*** 输出电压* @return*/String outputVoltage();}

1.4.6、AmericanChargerAdapter

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/30 9:51* @Description:*/
@Component(value = "American")
public class AmericanChargerAdapter implements ChargerAdapter {@Resourceprivate ChinaChargerAdaptee chinaChargerAdaptee;@Overridepublic String outputVoltage() {System.out.println("购买一个电源充电器,原始标准输出电压:" + chinaChargerAdaptee.outputVoltage());// 模拟电压转换String adapterVoltage = String.valueOf(Integer.valueOf(chinaChargerAdaptee.outputVoltage()) - 110);System.out.println("电压适配美国标准电压后的输出电压:" + adapterVoltage);return "【美国】输出标准电压" + adapterVoltage;}
}

1.4.7、IndiaChargerAdapter

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/30 9:51* @Description:*/
@Component(value = "India")
public class IndiaChargerAdapter implements ChargerAdapter {@Resourceprivate ChinaChargerAdaptee chinaChargerAdaptee;@Overridepublic String outputVoltage() {System.out.println("购买一个【中国制造】的电源充电器,原始标准输出电压:" + chinaChargerAdaptee.outputVoltage());// 模拟电压转换String adapterVoltage = String.valueOf(Integer.valueOf(chinaChargerAdaptee.outputVoltage()) + 10);System.out.println("电压适配印度标准电压后的输出电压:" + adapterVoltage);return "【印度】输出标准电压:" + adapterVoltage;}
}

1.4.8、JapanChargerAdapter

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/30 9:51* @Description:*/
@Component(value = "Japan")
public class JapanChargerAdapter implements ChargerAdapter {@Resourceprivate ChinaChargerAdaptee chinaChargerAdaptee;@Overridepublic String outputVoltage() {System.out.println("购买一个【中国制造】的电源充电器,原始标准输出电压:" + chinaChargerAdaptee.outputVoltage());// 模拟电压转换String adapterVoltage = String.valueOf(Integer.valueOf(chinaChargerAdaptee.outputVoltage()) - 120);System.out.println("电压适配日本标准电压后的输出电压:" + adapterVoltage);return "【日本】输出标准电压:" + adapterVoltage;}
}

1.4.9、NationParam

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/30 10:35* @Description:*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@ToString(callSuper = true)
public class NationParam implements Serializable {private String nationType;}

1.4.10、AdapterService

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/30 10:21* @Description:*/
public interface AdapterService {/*** 输出电压* @param param* @return*/String outputVoltage(NationParam param);}

1.4.11、AdapterServiceImpl

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/30 10:21* @Description:*/
@Service
public class AdapterServiceImpl implements AdapterService {@Overridepublic String outputVoltage(NationParam param) {ChargerAdapter chargerAdapter = SpringUtil.getBean(param.getNationType(), ChargerAdapter.class);return chargerAdapter.outputVoltage();}
}

1.4.12、AdapterController

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/30 10:18* @Description:*/
@RestController
public class AdapterController {@Resourceprivate AdapterService adapterService;@PostMapping("/outputVoltage")public String outputVoltage(@RequestBody NationParam param) {return adapterService.outputVoltage(param);}}

1.4.13、测试

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

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

相关文章

什么是美颜sdk?集成第三方美颜sdk的步骤

本文将深入探讨如何集成第三方美颜sdk,为直播平台引入更先进、更具吸引力的美颜特效。 第一步:选择合适的第三方美颜sdk 在开始集成美颜sdk之前,首要任务是选择适合自己直播平台需求的第三方美颜sdk。不同的sdk可能具有不同的特色和性能&a…

如何修改.exe文件的修改时间,亲测有效

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 演示视频: 10秒钟实现将文件的修改…

Linux:可视化管理工具Webmin的安装

一、下载 地址:Webmin官网 我这里下载的是1.700-1版本 二、安装 1、在虚拟机上新建目录并安装软件 mkdir /opt/webmin rpm -ivh webmin-1.700-1.noarch.rpm2、修改webmin的root密码 /usr/libexec/webmin/changepass.pl /etc/webmin root 1234563、修改端口(可…

掌握JavaScript中的解构赋值:深入挖掘隐藏的技巧

掌握JavaScript中的解构赋值:深入挖掘隐藏的技巧 前言基础概念为什么解构赋值如此重要?数组解构的基本语法:对象解构的基本语法:默认值: 解构赋值的妙用从对象和数组中提取值:从数组中提取值:从…

docker读取字体异常

解决方法 docker容器中执行 apk add ttf-freefont 根据版本不同 apk add ttf-dejavu-fonts apk add ttf-bernoulli

【开源】基于Vue.js的医院门诊预约挂号系统的设计和实现

项目编号: S 033 ,文末获取源码。 \color{red}{项目编号:S033,文末获取源码。} 项目编号:S033,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

第十五章 Linux

Python基础、函数、模块、面向对象、网络和并发编程、数据库和缓存、 前端、django、Flask、tornado、api、git、爬虫、算法和数据结构、Linux、设计题、客观题、其他 第十五章 Linux 1. 下面的linux命令中, 那个不能显示出文件的内容 A. tacB. moreC. headD. man在下面的…

Ranger安装和使用

Ranger部署 1.准备 1.1 编译 Ranger编译(已经编译过的话,直接看1.2) 1.1.1 准备到Ranger官网下载ranger的源码:http://ranger.apache.org/download.html 1.1.2 Ranger编译的过程实在非虚拟机环境下完成的,下载好r…

chapter10-homework-Java

第十章作业 Homework01知识点 Homework02知识点 Homework03知识点 Homework04知识点 Homework05知识点 Homework06Homework07Homework08 Homework01 分析执行结果。 public static void main(String[] args) {Car_ c new Car_();Car_ c1 new Car_(100);System.out.println(…

Vue中 实现自定义指令(directive)及应用场景

一、Vue2 1. 指令钩子函数 一个指令定义对象可以提供如下几个钩子函数 (均为可选): bind 只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。inserted 被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已…

三.排序与分页

目录 一.排序数据二.分页 一.排序数据 1.排序规则 使用ORDER BY 子句排序 ASC(ascend)升序DESC(descend)降序 ORDER BY 子句在SELECT语句的结尾 2.单列排序 SELECT last_name, job_id, department_id, hire_date FROM e…

(蓝桥杯)1125 第 4 场算法双周赛题解+AC代码(c++/java)

题目一&#xff1a;验题人的生日【算法赛】 验题人的生日【算法赛】 - 蓝桥云课 (lanqiao.cn) 思路&#xff1a; 1.又是偶数&#xff0c;又是质数&#xff0c;那么只有2喽 AC_Code:C #include <iostream> using namespace std; int main() {cout<<2;return 0; …

windows系统bat脚本命令总结之复制命令(copy和xcopy)

前言 做了一段时间的bat脚本开发&#xff0c;bat脚本中有各种各样的命令跟传统的编程逻辑完全不同&#xff0c;本专栏会讲解下各种各式的命令使用方法。 本篇文章讲解的是获取windows系统的复制命令&#xff08;copy和xcopy&#xff09;&#xff0c;copy和xcopy是Windows命令行…

【Web端CAD/CAE文字标注】webgl+canvas 2d实现文字标注功能

一、需求背景 在CAD/CAE领域经常会遇到显示节点编号这种需求&#xff0c;效果如下图&#xff1a; 本文介绍如何在WebGL中实现文字的显示&#xff0c;对于如何在OpenGL中实现请绕路。 二、实现原理 Canvas是HTML5提供的元素&#xff0c;用于在网页上绘制图形&#xff0c;其支…

设计循环队列

目录 设计循环队列 &#x1f642;【1】数组循环队列 思路分析 ❓1 ❓2 ❓3 易错总结 创建MyCircularQueue 初始化myCircularQueueCreate 为空否myCircularQueueIsEmpty 为满否myCircularQueueIsFull 插入元素myCircularQueueEnQueue 删除元素myCircularQueueDeQue…

load_policy命令详解与实例

1. 概述 load_policy是一个与systemd相关的命令,用于加载SELinux(Security-Enhanced Linux)策略。load_policy命令通常与SELinux策略文件(通常是以.pp或.te为扩展名的文件)一起使用,用于加载新的或更新的SELinux策略。 在加载新的SELinux策略后,新的访问控制规则将生效…

无醇啤酒行业分析:预计2028年将达到106亿美元

按照国际惯用的标准划分&#xff0c;通常将酒精度3.5%-4%的称为普通啤酒&#xff0c;将酒精度大于0.5%、小于2.5%的称为低醇啤酒&#xff0c;而酒精度小于0.5%便称为无醇啤酒。酒精给人带来的兴奋感&#xff0c;与体育比赛的紧张刺激相辅相成&#xff0c;啤酒也成为了许多球迷们…

基于UDP的网络聊天室

客户端 #include <myhead.h> //定义存储信息结构体 typedef struct _MSG {char code; //操作码&#xff1a;L表示登录C表示群聊S表示系统消息S表示退出char name[128]; char txt[256];}msg_t;//定义保存客户端网络信息的链表 typedef struct _ADDR {struct sockaddr_i…

第十四章 算法和数据结构

Python基础、函数、模块、面向对象、网络和并发编程、数据库和缓存、 前端、django、Flask、tornado、api、git、爬虫、算法和数据结构、Linux、设计题、客观题、其他 第十四章 算法和数据结构 1. 顺序表、链表的区别及应用场景。 顺序表&#xff08;Sequential List&#xf…

【elementUI】el-tab相关问题

Tabs 标签页 分隔内容上有关联但属于不同类别的数据集合。 <template><el-tabs v-model"activeName" tab-click"handleClick"><el-tab-pane label"用户管理" name"first">用户管理</el-tab-pane><el-tab-p…