适配器模式来啦

网上的大多数的资料中适配器模式和代理模式都是紧挨着进行介绍的,为什么呢???

是因为适配器模式和代理模式有太多的相似之处,可以进行联动记忆但是也要做好区分。

在菜鸟教程中,适配器模式的定义是作为两个不兼容接口之间的桥梁使其变得可兼容;从代码层面来解释就是有一个接口需要实现,但是现有的对象都不满足,需要对对象进行适配(就是加一层伪装)

适配器模式总共有三种,默认适配器模式,对象适配器模式,类适配器模式

一、默认适配器模式

用 Appache commons-io 包中的 FileAlterationListener 做例子,此接口定义了很多的方法,用于对文件或文件夹进行监控,一旦发生了对应的操作,就会触发相应的方法。

public interface FileAlterationListener {void onStart(final FileAlterationObserver observer);void onDirectoryCreate(final File directory);void onDirectoryChange(final File directory);void onDirectoryDelete(final File directory);void onFileCreate(final File file);void onFileChange(final File file);void onFileDelete(final File file);void onStop(final FileAlterationObserver observer);
}

此接口的一大问题是抽象方法太多了,如果我们要用这个接口,意味着我们要实现每一个抽象方法,如果我们只是想要监控文件夹中的文件创建文件删除事件,可是我们还是不得不实现所有的方法,很明显,这不是我们想要的。

所以,我们需要下面的一个适配器,它用于实现上面的接口,但是所有的方法都是空方法,这样,我们就可以转而定义自己的类来继承下面这个类即可

public class FileAlterationListenerAdaptor implements FileAlterationListener {public void onStart(final FileAlterationObserver observer) {}public void onDirectoryCreate(final File directory) {}public void onDirectoryChange(final File directory) {}public void onDirectoryDelete(final File directory) {}public void onFileCreate(final File file) {}public void onFileChange(final File file) {}public void onFileDelete(final File file) {}public void onStop(final FileAlterationObserver observer) {}
}

我们可以定义以下类,我们仅仅需要实现我们想实现的方法就可以了

public class FileMonitor extends FileAlterationListenerAdaptor {public void onFileCreate(final File file) {// 文件创建doSomething();}public void onFileDelete(final File file) {// 文件删除doSomething();}
}

默认适配器模式是三种适配器中最简单的一种模式,整体是为了单一职责原则,过滤掉本身不需要的能力,防止给调用方造成空能力的假象

二、对象适配器模式

大家都看过电影聊斋画皮吧,其中九霄美狐小唯因王家军首领王生勇猛英俊对其萌生爱意,想取代王生妻子佩蓉的地位。但是小唯是狐狸啊,想要和王生在一起至少得变成一个人吧(至少看起来是人),所以小唯披上了一个绝色美女的皮用于迷惑王生,使得狐狸小唯的行为在王生等人看来和自己没什么区别。

举个🌰

public interface Fox {public void walk(); // 走路public void eat(); // 吃饭
}public interface Person {public void walk(); // 走路public void eat(); // 吃饭
}public class XiaoWei implements Fox {public void walk() {System.out.println("狐狸走路,四条腿");}public void eat() {System.out.println("狐狸吃饭");}
}public class WangSheng implements Person {public void walk() {System.out.println("人走路,两条腿");}public void eat() {System.out.println("人吃饭");}
}

人接口有 walk() 和 eat() 两个方法,狐狸 Fox 如果要冒充人, walk() 和 eat() 两个方法是现成的,但是本质上是不同的(狐狸实现Fox接口 , 人实现Person接口),所以需要适配让狐狸小唯看起来像人

这里相当于祭炼法器了(FoxAdapter)

// 毫无疑问,首先,这个适配器肯定需要 implements Person,这样才能当做人来看
public class FoxAdapter implements Person {Fox fox;// 构造方法中需要一个狐狸的实例,此类就是将这只狐狸适配成人来用public FoxAdapter(Fox fox) {this.fox = fox;}// 实现人的走路方法@Overridepublic void walk() {// 内部其实是一只狐狸的走路fox.walk();}@Overridepublic void eat() {// 内部其实是一只狐狸的吃饭    fox.eat();}
}

然后就是使用法器(FoxAdapter)

public static void main(String[] args) {// 有一只美狐小唯Fox xiaowei = new XiaoWei();// 成功将美狐小唯适配成人Person person = new FoxAdapter(xiaowei);...
}

用一个小小的图来加深一下理解

adapter-1

三、类适配器模式

小心,看图😏

adapter-1

 看到这个图,大家应该很容易理解的吧,通过继承的方法,适配器自动获得了所需要的大部分方法,在适配器中包装一下不就妥妥的。这个时候,客户端使用更加简单,直接 Target t = new SomeAdapter(); 就可以了

四、适用场景

适配器模式主要用于查缺补漏阶段而不是设计阶段。当出现两个接口不兼容的问题才会使用该设计模式,而不是一开始就设计成这样的模式。

如果想要对多类对象和对象的能力进行组合叠加可使用桥接模式

五、总结

文章中一开始就说过代理模式和适配器模式是有相似的,get到了吗🤔

代理模式和适配器模式(对象)都是以对象组合的方式进行代理和适配,不过不同的是代理相当于游戏中给游戏角色上外挂,只是对原有能力的增强。例如刺激战场的自动瞄准挂,原本角色就能开枪干人只是中不中的问题,加了外挂增强开枪干人的命中率并没有改变本质行为。适配模式则是本质上的改变,别人是开枪干人,结果你适配成开战斗机扫射。

立秋 渐寒 添衣 勿病 安好

五、引用

1、Java 设计模式 - 掘金

2、适配器模式 | 菜鸟教程

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

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

相关文章

数学类问题(Leetcode)

1.质数数量 nullhttps://leetcode.cn/problems/count-primes/description/解题思路&#xff1a; 遍历大于1 且小于n的每个数的倍数&#xff0c;设置为非质数&#xff0c;剩下的就都是质数了。 代码&#xff1a; class Solution { public:int countPrimes(int n) {if(n<2)…

【机器学习2】什么是Jupyter notebook 新手使用Jupter notebook

什么是Jupyter notebook? Jupyter Notebook&#xff08;此前被称为 IPython notebook&#xff09;是一个交互式笔记本&#xff0c;支持运行 40 多种编程语言。 Jupyter Notebook 的本质是一个 Web 应用程序&#xff0c;便于创建和共享程序文档&#xff0c;支持实时代码&#x…

机器学习实战13-超导体材料的临界温度预测与分析(决策树回归,梯度提升回归,随机森林回归和Bagging回归)

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战13-超导体材料的临界温度预测与分析(决策树回归,梯度提升回归,随机森林回归和Bagging回归)&#xff0c;这几天引爆网络的科技大新闻就是韩国科研团队宣称发现了室温超导材料-LK-99&#xff0c;这种材料…

Redisson 3.23.1 正式发布,官方推荐的 Redis 客户端

导读Redisson 3.23.1 现已发布&#xff0c;这是一个 Java 编写的 Redis 客户端&#xff0c;具备驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;功能&#xff0c;并获得了 Redis 的官方推荐。 此版本更新内容如下&#xff1a; Improvement 减少了 RLiveObjectSer…

决策树和随机森林对比

1.用accuracy来对比 # -*-coding:utf-8-*-""" accuracy来对比决策树和随机森林 """ from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine#(178, 13…

K8S系列文章之 自动化运维利器 Ansible

Ansible-安装 第一步&#xff1a;安装我们的epel扩展源 yum -y install epel-release 我这里会报/var/run/yum.pid 已被锁定&#xff0c;如果没有直接进行下一步 [rootmaster home]# yum -y install epel-release 已加载插件&#xff1a;fastestmirror, langpacks /var/run/…

C语言 用数组名作函数参数

当用数组名作函数参数时&#xff0c;如果形参数组中各元素的值发生变化&#xff0c;实参数组元素的值随之变化。 1.数组元素做实参的情况&#xff1a; 如果已经定义一个函数&#xff0c;其原型为 void swap(int x,int y);假设函数的作用是将两个形参&#xff08;x,y&#xf…

【css】组合器

组合器是解释选择器之间关系的某种机制。在简单选择器器之间&#xff0c;可以包含一个组合器&#xff0c;从而实现简单选择器难以达到的效果。 CSS 中有四种组合器&#xff1a; 后代选择器 (空格)&#xff1a;匹配属于指定元素后代的所有元素&#xff0c;示例&#xff1a;div …

GWJDN-400型2MHZ自动平衡高温介电温谱仪

GWJDN-400型2MHZ自动平衡高温介电温谱仪 关键词&#xff1a;介电常数&#xff0c;高温介电&#xff0c;自动平衡 主要功能&#xff1a; 材料介电常数测试仪 半导体材料的介电常数、导电率和C-V特性液晶材料:液晶单元的介电常数、弹性常数等C-V特性 性能特点: 温度&#xf…

【CSS】说说响应式布局

目录 一、是什么 二、怎么实现 1、媒体查询 2、百分比 3、vw/vh 4、小结 三、总结 一、是什么 响应式设计简而言之&#xff0c;就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。 响应式网站常见特点&#xff1a; 同时适配PC 平板 手机等…

yxBUG记录

1、 原因&#xff1a;前端参数method方法名写错。 2、Field ‘REC_ID‘ doesn‘t have a default value 问题是id的生成问题。 项目的表不是自增。项目有封装好的方法。调用方法即可。 params.put("rec_id",getSequence("表名")) 3、sql语句有问题 检…

Docker 快速安装 MinIO

概述 MinIO 是一款基于Go语言的高性能对象存储服务&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 拉取docker镜像 docker pull minio/minio创建宿主机数据目录&#xff08;共享数据卷&#xff09; 此…

Django进阶

1.模板 1.1 寻找html模板 TEMPLATES [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR, templates)],APP_DIRS: True,OPTIONS: {context_processors: [django.template.context_processors.debug,django.template.context_process…

【IDEA + Spark 3.4.1 + sbt 1.9.3 + Spark MLlib 构建鸢尾花决策树分类预测模型】

决策树进行鸢尾花分类的案例 背景说明&#xff1a; 通过IDEA Spark 3.4.1 sbt 1.9.3 Spark MLlib 构建鸢尾花决策树分类预测模型&#xff0c;这是一个分类模型案例&#xff0c;通过该案例&#xff0c;可以快速了解Spark MLlib分类预测模型的使用方法。 依赖 ThisBuild /…

会这个Python的测试员,工作都不会太差!

Python语言得天独厚的优势使之在业界的火热程度有增无减&#xff0c;尤其是在经历了互联网&#xff0c;物联网&#xff0c;云计算&#xff0c;大数据&#xff0c;人工智能等浪潮的推动下&#xff0c;其关注度&#xff0c;普适度一路走高。 对于测试人员来说&#xff0c;很多人…

科技感响应式管理系统后台登录页ui设计html模板

做了一个科技感的后台管理系统登录页设计&#xff0c;并且尝试用响应式布局把前端html写了出来&#xff0c;发现并没有现象中的那么容易&#xff0c;chrome等标准浏览器都显示的挺好&#xff0c;但IE11下面却出现了很多错位&#xff0c;兼容起来还是挺费劲的&#xff0c;真心不…

Linux系统中redis基础

本节主要学习redis的概述&#xff0c;安装目录结构&#xff0c;命令解析和redis登录更改&#xff0c;数据库的操作&#xff0c;和redis的持久化。 目录 一、概述 二、安装 1.编译安装 2.rpm安装 三、目录结构 四、命令解析 五、redis登陆更改 问题 解决办法 六、数据…

P11-Transformer学习1.1-《Attention Is All You Need》

Transformer目录:《Transformer Paper》1.0 CV Transformer必读论文5篇_汉卿HanQ的博客-CSDN博客 前文参考:Transformer1.0-预热_汉卿HanQ的博客-CSDN博客 全文1w3字左右&#xff0c;按照论文翻译个人理解精读&#xff0c;如果对你有所帮助&#xff0c;欢迎点个赞哦&#xff…

MQTT消息传输过程,网络断开后,断线重连及订阅消息恢复

1&#xff0c;首先要在网络失败的地方进行client重连 2&#xff0c;一定要设置发送超时&#xff0c;默认是-1&#xff0c;是不断进行发送的&#xff0c;会被长阻塞在这里&#xff0c;单位是ms 3&#xff0c;参考链接 https://vimsky.com/examples/detail/java-method-org.ec…

揭秘无人机在水利行业中如何应用

无人机的应用已经成为现代科技的重要组成部分&#xff0c;在水利行业中&#xff0c;无人机的应用同样发挥了极其重要的作用。无人机在水利行业中的应用&#xff0c;不仅提高了工作效率&#xff0c;还极大地降低了人力和物力成本&#xff0c;为水利工作注入了新的活力。 一、无人…