JAVA架构师之路十一:设计模式之适配器模式

article/2025/9/29 11:10:41

JAVA架构师之路十:设计模式之组合模式

适配器模式

    • 1. 适配器模式
    • 2. 类适配器写法
    • 3. 对象适配器写法
    • 4. 接口适配器写法

钟表,可以回到起点,但已不是昨天。

生活中处处可见适配现象:手机充电器的充电头,电脑电源适配器,高压变压器,等等都是适配器的案例。

1. 适配器模式

定义

适配器模式又叫做变压器模式,它的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致的无法在一起工作的两个类能够在一起工作。
属于结构型设计模式

适用场景

已经存在的类,它的方法和需求不匹配(方法结果相同或者相似)的情况

适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同的产品、不同的厂家造成功能类似而接口不同情况下的解决方案。

优点

能提高类的透明性和复用,现有的类复用但不需要改变

目标类和适配器类解耦,提高程序的扩展性

在很多业务场景中符合开闭原则

缺点

适配器编写过程需要全面考虑,可能会增加系统的复杂性

增加代码的阅读难度,降低代码的可读性,过多使用适配器会使系统代码变得凌乱

2. 类适配器写法

适配器模式有一个经典案例:我们的电压一般是220V,但是我们的手机等家用电器有些不是220V,需要电源适配器做一个转化,比如说说手机一般是5V的充电器才能工作。

public class AC220V {public int outAC220V() {int i = 220;System.out.println("交流电:" + i + "V");return i;}
}
public interface DC5V {int outputDC5V();
}
public class PowerAdapter extends AC220V implements DC5V {public int outputDC5V() {int ac = super.outAC220V();int dc = ac / 44;System.out.println("输入:" + ac + "V,输出: " + dc + "V");return dc;}
}
public class Test {public static void main(String[] args) {DC5V dc5V = new PowerAdapter();int dc = dc5V.outputDC5V();System.out.println("适配器转化电压:" + dc + "V");}
}
交流电:220V
输入:220V,输出: 5V
适配器转化电压:5V

在这里插入图片描述

3. 对象适配器写法

类适配器有一个缺点就是违背了最少知道原则,因为是继承了父类,用对象适配器写法就可以回避这个问题,如下:

public class PowerAdapter implements DC5V {private AC220V ac220V;public PowerAdapter(AC220V ac220V) {this.ac220V = ac220V;}public int outputDC5V() {int ac = this.ac220V.outAC220V();int dc = ac / 44;System.out.println("输入:" + ac + "V,输出: " + dc + "V");return dc;}
}
public class Test {public static void main(String[] args) {DC5V dc5V = new PowerAdapter(new AC220V());int dc = dc5V.outputDC5V();System.out.println("适配器转化电压:" + dc + "V");}
}
交流电:220V
输入:220V,输出: 5V
适配器转化电压:5V

在这里插入图片描述

4. 接口适配器写法

我们的手机是5V电压,我们的电脑就不是5V了,电视、剃须刀、蓝牙耳机等等,那么按照以上的两种写法,我们要写很多适配器,这样显然不太合理,那么接口适配器写法就能帮我们解决问题。

public interface DC{int output5V();int output12V();int output24V();int output36V();
}
public class PowerAdapter implements DC {private AC220V ac220V;public PowerAdapter(AC220V ac220V) {this.ac220V = ac220V;}public int output5V() {int ac = this.ac220V.outAC220V();int dc = ac / 44;System.out.println("输入:" + ac + "V,输出: " + dc + "V");return dc;}public int output12V() {// todoreturn 0;}public int output24V() {// todoreturn 0;}public int output36V() {// todoreturn 0;}
}
public class Test {public static void main(String[] args) {DC dc = new PowerAdapter(new AC220V());int dc5v = dc.output5V();int dc12v = dc.output5V();int dc24v = dc.output5V();int dc36v = dc.output5V();System.out.println("适配器转化电压:" + dc5v + "V");}
}

感谢您阅读本文,如果您觉得文章写的对您有用的话,请您点击上面的“关注”,点个赞,这样您就可以持续收到《JAVA架构师之路》的最新文章了。文章内容属于自己的一点点心得,难免有不对的地方,欢迎在下方评论区探讨,你们的关注是我创作优质文章的动力。

JAVA架构师之路十二:设计模式之桥接模式


http://chatgpt.dhexx.cn/article/4qbuUuip.shtml

相关文章

Java架构师:概述

一、Java架构师核心技术栈 二、架构师需要具备的其他能力 三、技术选型 四、早期传统JavaWeb开发模式 五、前后端分离开发模式 六、Maven聚合项目 七、数据库设计工具PDMan 八、数据库外键弊端【移除物理外键,而非逻辑外键】 数据库表与表之间字段间不要有物理外键…

Java架构师之路:微服务架构图解和详情

微服务框架搭建: 总体规划框架名称当前技术选型方案微服务框架搭建 开发框架 单体服务SpringBoot 分布式框架SpringCloud 最新框架SpringCloudAlibaba 服务配置中心 服务消息总线 阿里巴巴Nacos、 ConfigBusRabbitMQ配合使用、 携程apolo 服务网关 Spr…

java架构师进阶之路

要想进阶为架构师,不仅要有知识广度,还要有深度。 最近把今天收集的java学习资料整理了下,里面包含了计算机基础、算法和数据结构、常用工具、java核心知识、性能优化、基础框架、数据库、消息队列、缓存中间件、搜索引擎、大数据、RPC、网关…

通往Java架构师之路

Java架构师,应该算是一些Java程序员们的一个职业目标了吧,很多码农码了五六年的代码也没能成为架构师。那成为Java架构师要掌握哪些技术呢,总体来说呢,有两方面,一个是基础技术,另一个就是组织能力和提出解决方案能力。…

如何成为Java架构师?学习路线是怎样的?大佬总结成长之路跟着往上走,建议你提早开始准备!

导读 好程序员告诉你Java架构师学习路线,从初级Java工程师成长为Java架构师,你需要走很长的路,很多有计划的人在学习之初就在做准备。你知道Java架构师学习路线该怎么走吗?成为一个优秀的Java架构师究竟需要学什么?接下来就跟小编一起揭晓…

从三方面分析,Java程序员如何晋升为高薪Java架构师?

对于工作多年的程序员而言,日后的职业发展无非是继续专精技术、转型管理和晋升架构师三种选择。下面,我从架构师在一家公司有多重要、优秀架构师需要具备怎样的素质以及架构师的发展现状三个方面来分析,Java程序员如何才能晋升为优秀的高薪Java架构师? 希望通过本文我的分…

getByte()用法小结

在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如&a…

java中String的getByte()方法

Java getBytes() 方法 Java String类 getBytes() 方法有两种形式: getBytes(String charsetName): 使用指定的字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。getBytes(): 使用平台的默认字符集将字符串编码为 byte 序列&#…

JAVA中的getBytes方法

在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如&a…

JAVA中的getBytes()方法

在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如&a…

Java数组作业题

计算一维数组中最大值和最小值的数据之和; package org.oracle.test;public class Arr01 {public static void main(String[] args) {int[] arr { 6, 3, 2, 7, 9, 1, 5, 4, 4, 4, 10, 9 };int max arr[0];int min arr[0];for (int i 1; i < arr.length; i) {if (max &l…

Oracle、hive、Hbase基本操作

文章目录 Oracle基本操作概述库相关备份库还原库 表相关数据相关 hive基本操作库相关表相关表操作 Hbase基本操作概述操作 Oracle基本操作 概述 Oracle 一般创建一个全局库&#xff0c;可以但不建议创建多个库Oracle 一个用户是一个库&#xff0c;创建不同的库就要创建不同的…

数据库:Oracle和MySQL

关系型数据库 概念 关系数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。简单说&#xff0c;关系型数据库是由多张能互相联接的二维行…

Oracle SQL学习笔记

参考&#xff1a;FreeIT-Oracle教程 实用sql 0.1、update内容中含有单引号 方案&#xff1a;用两个单引号代替一个单引号 select to_char(aa否aa) from dual;--aa否aa 0.2、找表 -- 找表 select a.OWNER 表所属用户,a.TABLE_NAME 表明,a.* from all_tables a where a.TABL…

oracle取第二大的值,【Oracle】oracle取最大值和最小值的几个方法汇总

(1)oracle使用keep分析函数取最值记录 -- 取工资sal最大的雇员姓名及其工资,以及工资sal最少的雇员姓名及其工资 select deptno, empno, ename, sal, max(ename) keep(dense_rank FIRST order by sal) over (partition by deptno) as min_sal_man, max(sal) keep(dense_rank F…

数组与集合

数组与集合 数组 数组是一组具有相同类型的有序数据的集合。数组中的一个数据成员称为数组元素。数组生成后&#xff0c;数组长度不可改变。 字符串数组&#xff1a;字符串数组在初始化时创建 对象数组&#xff1a;可以将不同数据类型的元素封装成对象数组 Object a[] new Ob…

复习笔记第六章 - JAVA中的数组

文章目录 一、数组的创建及初始化1. 数组创建格式2. 数组的初始化3. 数组元素的默认值 二、数组的使用1. 使用下标访问数组元素2. 遍历数组 三、数组是引用类型1. 初始JVM内存分布**区域划分** 2. 基本类型变量和引用类型变量的区别2.1 基本数据类型作为函数参数2.2 引用数据类…

java 删除组中的0元素,Java中如何优雅地删除List中的元素

在工作中的许多场景下,我们都会使用到List这个数据结构,那么同样的有很多场景下需要删除List中的某一个元素或某几个元素,那么我们该如何正确无误地删除List中的元素的,今天我来教大家三种方式。 前提知识准备 for循环的执行顺序 这里借用百度百科的一张图,简明扼要的介绍…

java删除数组中重复元素

id"BAIDU_DUP_fp_iframe" src"https://pos.baidu.com/wh/o.htm?ltr"> > src"http://v3.jiathis.com/code/jiathis_utility.html">     Java SE GXW33 10-08 14:30 等级 28次回复 java删除数组中重复元素 java删除数组中重复…

Nature:Deep Learning 深度学习综述

翻译&#xff1a;https://artificial-intelligence.net.cn/2019/06/05/1559711811/?fromsinglemessage&isappinstalled0 作者&#xff1a;Yann LeCun, Yoshua Bengio ,Geoffrey Hinton 发表及时间&#xff1a;Nature&#xff0c;2015 概念&#xff1a;深度学习允许由多…