Java真的不难(三十五)适配器模式
适配器模式
哈喽大家好,四月份啦!!!很高兴在这里与大家再次相遇,我相信大家都是热爱技术的伙计们,也正是因为有你们的支持和陪伴,小应学长在2022年第三季新星计划内获得Java后端Top3,这也是导师和大家对我创作的肯定,我将继续努力写出通俗易懂的技术文章,但是小应学长难免有不足之处,也有粗心大意的时候,在这里恳请大家批评指正! 那么我们四月份的文章,就在这里开始吧~~
1、什么是适配器模式?
其实适配器这三个字大家应该很熟悉,我们知道苹果公司的手机iPhone已经不提供充电插头了,包装盒内只有一根数据线,那么我们无法单独使用这根数据线进行在220V的插板上充电,因此我们需要重新购买一个适配器来把插板和手机连接起来,这就是适配器。
其实在软件设计中也可能出现,需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。
2、适配器模式的定义
适配器模式: 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
3、适配器模式的优缺点
优点:
- 客户端通过适配器可以透明地调用目标接口
- 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类
- 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题
- 在很多业务场景中符合开闭原则
缺点:
- 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性
- 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱
4、适配器模式的结构与实现
(以下结构参考自互联网)
模式的结构:
- 目标(Target)接口: 当前系统业务所期待的接口,它可以是抽象类或接口
- 适配者(Adaptee)类: 它是被访问和适配的现存组件库中的组件接口
- 适配器(Adapter)类: 它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者
类适配器模式的结构:
对象适配器模式的结构:
5、适配器模式的代码实现
A、使用组合的方式实现适配器:
我们现在有一台笔记本电脑的插头的三相的,但是我们现在需要使用二相的插头进行充电,所以我们需要给这个插头装上一个二相的适配器:
三相插座接口:
/*** 三相插座接口*/
public interface ThreePlugIf {//使用三相电流供电public void powerWithThree();}
国标的二相插座:
/*** 国标的二相插座*/
public class GBTowPlug {public void powerWithTwo(){System.out.println("使用二相电流供电");}
}
笔记本:
/*** 笔记本*/
public class NoteBook {private ThreePlugIf plug;public NoteBook(ThreePlugIf plug){this.plug = plug;}//使用插座充电public void charge(){plug.powerWithThree();}
}
三相转二相的插座适配器:
/*** 三相转二相的插座适配器*/public class TwoPlugAdapter implements ThreePlugIf {private GBTowPlug plug;public TwoPlugAdapter(GBTowPlug plug) {this.plug = plug;}@Overridepublic void powerWithThree() {System.out.println("通过转换");plug.powerWithTwo();}
}
测试类:
public class Test {public static void main(String[] args) {GBTowPlug two = new GBTowPlug();ThreePlugIf three = new TwoPlugAdapter(two);NoteBook nb = new NoteBook(three);nb.charge();}
}
输出结果:
通过转换
使用二相电流供电
采用组合方式的适配器称为对象适配器
特点:
把“被适配者”作为一个对象组合到适配器类中,以修改目标接口包装给适配者
B、使用继承的方式实现适配器:
继承适配器:
/*** 采用继承方式的插座适配器*/
public class TwoPlugAdapterExtends extends GBTowPlug implements ThreePlugIf{@Overridepublic void powerWithThree() {System.out.println("借助继承适配器");this.powerWithTwo();}
}
测试类:
public class Test {public static void main(String[] args) {GBTowPlug two = new GBTowPlug();ThreePlugIf three = new TwoPlugAdapter(two);NoteBook nb = new NoteBook(three);nb.charge();//使用继承方法three = new TwoPlugAdapterExtends();nb = new NoteBook(three);nb.charge();
}
}
输出:
通过转换
使用二相电流供电借助继承适配器
使用二相电流供电
采用继承方式的称为类适配器
特点:
通过多重继承不兼容接口,实现对目标接口的匹配,单一的为某个类而实现适配
6、适配器模式的应用场景
- 之前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致
- 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同
最后,祝大家假期愉快~~~~
Java真的不难(三十五)适配器模式相关推荐
- java并发编程(三十五)——公平与非公平锁实战
前言 在 java并发编程(十六)--锁的七大分类及特点 一文中我们对锁有各个维度的分类,其中有一个维度是公平/非公平,本文我们来探讨下公平与非公平锁. 公平|非公平 首先,我们来看下什么是公平锁和非 ...
- Java入门(三十五)
Map集合概述和特点 map由两部分组成,k是map集合里面存储键的类型,v是map里面存储值的类型. map集合是一个接口,将键映射到值的对象,他不能包含重复的键,每个键可以映射到一个值. 举例,比 ...
- Java基础(三十五)Math、Random类和数字格式化(String.format方法)
一.Math类 Math类常用的方法: public static long abs (double a) 返回a的绝对值 public static double max (double a,dou ...
- Java多线程学习三十五: CyclicBarrier 和 CountDownLatch 有什么不同
CyclicBarrier 和 CountDownLatch 有什么不同? CyclicBarrier作用 CyclicBarrier 和 CountDownLatch 确实有一定的相似性,它们都能阻 ...
- Java Review(三十六、IO)
文章目录 File 类 访问文件和目录 1.访问文件名相关的方法 2. 文件检测相关的方法 3. 获取常规文件信息 4. 文件操作相关的方法 5. 目录操作相关的方法 文件过滤器 IO流概览 流的分类 ...
- 三十五、深入Java中的泛型(下篇)
@Author:Runsen @Date:2019年10月26日 17:10:34 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件 ...
- 【零基础学Java】—System类(三十五)
[零基础学Java]-System类(三十五) java.lang.System 类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作 在System类的API文档中,常用的方法有: pub ...
- JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!
JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...
- Java学习笔记(三十五)
在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度.现在将跟着视频做的笔记进行整理.本篇博客是整理Java知识点的第三十五 ...
- 程序员与年龄:四十岁普通开发、三十五岁首席架构、三十岁基层Leader
最近,有一个词儿特别热门--躺平.有没有人跟你说过:"躺平说起来容易,做起来更容易." 和躺平相对的是另外一个词--内卷,群聊的时候,已经很多次看过草卷起来了.jpg表情包.某些节 ...
最新文章
- HashTable, HashMap, LinkedHashMap, ConcurrentHashMap
- linux基础命令 echo
- opencv学 之图像傅里叶变换dft
- 你的网站被“白名单”了吗?
- linux php mysqldump,Linux Shell脚本之利用mysqldump备份MySQL数据库(详细注解)
- python defaultdict 递归_在Python中使用defaultdict初始化字典以及应用方法
- Excel使用VBA小程序的方法
- 魅族 刷机android 6.0,魅族MX6如何刷机升级 魅族MX6升级方法【详解】
- php-screw 安装,php_screw安装,使用
- 什么是 promise?
- 转载-酷狗音乐API
- mysql修改系统日期_修改系统和MySQL时区
- mysql查询余额变化,SQL查询解决方案-逐日余额
- imgui Study
- SDUT 2055-来淄博旅游
- java后台Controller下载文件方法
- linux软件下载管理
- C51串口的SCON寄存器及工作…
- 我的创作纪念日——“永远相信美好的事情即将发生”
- 利用ESP8266与米思齐从零制作模拟温室大棚--介绍篇
热门文章
- echarts 环形进度图
- 交了19.9元瑞文IQ测试被坑后,手写了一个自己慢慢测~
- android程序如何加密软件,如何在Android手机上隐藏(加密)文件夹(软件)
- [Cesium] 使用primitive绘制多段线
- SpringBoot入门-分组校验
- IDL--辐射定标(Radiometric Calibration )
- Android免Root录屏
- C#异常提示.WAV,MP3等文件不是一个有效的波形文件
- 浅析百度爱采购运营推广的可信度@运营猫工具箱
- Oracle Discoverer 11.1.1.7安装以及与Oracle EBS R12.1.3的集成