系列二十五、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、修改端口(可…

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…

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; …

【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…

无醇啤酒行业分析:预计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…

【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…

Linux重置MySql密码(简洁版)

关闭验证 /etc/my.cnf-->[mysqld]-->skip-grant-tables 重启MySql service mysql restart 登陆MySql mysql -u root 刷新权限 FLUSH PRIVILEGES; 更新密码 ALTER USER rootlocalhost IDENTIFIED BY 123456; 退出MySql exit 打开验证 /etc/my.cnf-->[mysqld]-->skip…

建设“参与城市”大学--SMU在2023年绿色金融全球论坛上分享观点

2023年11月21日&#xff0c;由新加坡管理大学&#xff08;SMU&#xff0c;简称新大&#xff09;和中国人民大学&#xff08;RUC&#xff0c;简称人大&#xff09;联合主办的“绿色金融与治理&#xff1a;从承诺到行动”全球论坛在北京召开。论坛汇集了来自新加坡、中国及世界各…

SpringBoot项目打成jar包后,上传的静态资源(图片等)如何存储和访问

1.问题描述&#xff1a; 使用springboot开发一个项目&#xff0c;开发文件上传的时候&#xff0c;通常会将上传的文件存储到资源目录下的static里面&#xff0c;然后在本地测试上传文件功能没有问题&#xff0c;但是将项目打成jar包放到服务器上运行的时候就会报错&#xff0c…

P26 C++创建并初始化对象

目录 前言 01 在堆栈上创建对象 02 堆栈上创建对象有什么区别 03 在栈上实例化对象 04 在堆中实例化对象 前言 本章我们讨论一下 C 创建对象的相关问题。 如果你还不了解什么是类&#xff0c;可以点击下文查看 P9 C类-CSDN博客 本章以下主要讲解以下几点 在栈上创建对象…

大数据分析与应用实验任务十

大数据分析与应用实验任务十 实验目的&#xff1a; 通过实验掌握spark SQL的基本编程方法&#xff1b; 熟悉RDD到DataFrame的转化方法&#xff1b; 通过实验熟悉spark SQL管理不同数据源的方法。 实验任务&#xff1a; 进入pyspark实验环境&#xff0c;在桌面环境打开jup…