JAVA设计模式-适配器模式

一.概念

​ 将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

​ 在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。

​ 根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。

​ 缺省适配器模式(Default Adapter Pattern):当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式。缺省适配器模式是适配器模式的一种变体,其应用也较为广泛。在JDK类库的事件处理包java.awt.event中广泛使用了缺省适配器模式,如WindowAdapter、KeyAdapter、MouseAdapter等。

适配器模式实现的方式有三种:类适配器对象适配器接口适配器

二.角色

  • Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。

  • Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。

  • Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。

三.优缺点

优点
  • 可以让任何两个没有关联的类一起运行。
  • 提高了类的复用。
  • 增加了类的透明度。
  • 灵活性好。
缺点
  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
  • 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

四.适用场景

  • 想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。

  • 我们有一个类,想将其设计为可重用的类(可已经被多处访问了),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。

  • 想要使用接口中的某个或者某些方法,但是接口中有太多不是自己需要的方法了,接口在实现时必须实现其中的所有方法,这个时候就要使用抽象类来实现接口,并不对所有方法进行实现(进置空),然后我们再继承这个抽象类来重写想要的方法。这个抽象类就是适配器

五.类适配器

Adapter 类继承Adaptee (被适配类),同时实现Target 接口(因为 Java 不支持多继承,所以只能通过接口的方法来实现多继承),在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。

1.实现
创建被适配的类
public class Adaptee {public void adapteeRequest() {System.out.println("被适配者的方法");}
}
定义一个目标接口
public interface Target {void request();
}
创建适配器类

实现 Target 接口,同时继承了 Adaptee 类,然后在实现的 **request()**方法中调用父类的 adapteeRequest()

public class Adapter extends Adaptee implements Target{@Overridepublic void request() {//...一些操作...super.adapteeRequest();//...一些操作...}
}

六.对象适配器

对象适配器与类适配器不同之处在于,类适配器通过继承来完成适配,对象适配器则是通过关联来完成,这里稍微修改一下 Adapter 类即可将转变为对象适配器

1.实现
public class Adapter implements Target{// 适配者是对象适配器的一个属性private Adaptee adaptee = new Adaptee();@Overridepublic void request() {//...adaptee.adapteeRequest();//...}
}

注意这里的 Adapter 是将 Adaptee 作为一个成员属性,而不是继承它

七.接口适配器

        当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求,它适用于一个接口不想使用其所有的方法的情况。

1.实现
手机品牌接口
public interface MobilePhoneBrand {String xiaomi();String huawei();String apple();String vivo();String oppo();String samsung();
}
创建抽象类
public abstract class MobilePhoneDefault implements MobilePhoneBrand{public String xiaomi(){return null;}public String huawei(){return null;}public String apple(){return null;}public String vivo(){return null;}public String oppo(){return null;}public String samsung(){return null;}}
创建具体实现类
中国手机品牌
public class ChinaMobilePhone extends MobilePhoneDefault {public String xiaomi(){return "小米";}public String huawei(){return "华为";}public String vivo(){return "VIVO";}public String oppo(){return "OPPO";}}
美国手机品牌
public class USAMobilePhone extends MobilePhoneDefault {public String apple(){return "苹果";}
}
韩国手机品牌
public class KoreaMobilePhone extends MobilePhoneDefault {public String samsung(){return "三星";}
}

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

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

相关文章

【vue3+ts】项目初始化

1、winr呼出cmd,输入构建命令 //用vite构建 npm init vitelatest//用cli脚手架构建 npm init vurlatest2、设置vscode插件 搜索volar,安装前面两个 如果安装了vue2的插件vetur,要禁用掉,否则插件会冲突

vscode安装svn扩展(windows)

一、安装 1.1 环境说明 操作系统 windows 10 1.2 安装过程 1. 安装svn 双击安装程序 点击next 继续next 继续next 点击Install 在弹出框中点击 是 开始安装进度,一会将安装成功 安装结束 右键菜单栏中已经有svn选项,并且能正常拉取以…

怎么把heic改成jpg?方法大全在这里

怎么把heic改成jpg?HEIC是一种现代的图像文件格式。它是由ISO制定的标准,并得到了苹果公司的支持和推广。与JPG等传统图像格式相比,HEIC格式可以提供更好的图像质量,并且占用更少的存储空间。这使得它在手机、平板电脑和其他移动设…

气膜建筑的可持续性:能源效益与环境影响

气膜建筑作为现代建筑技术的一种创新形式,不仅为城市景观增添了未来感,同时也在建筑领域引发了可持续性发展的讨论。本文将探讨气膜建筑在可持续性方面的关键议题,特别聚焦于其能源效益和环境影响,以期为未来气膜建筑设计和规划提…

Tomcat自启动另一种方法

Tomcat自启动另一种方法 问题: 不知道怎么回事,好几台电脑都可以开机自启动tomcat,正常运行项目。一样的配置一样的操作流程,偏偏要运行的机器开机自启动后,项目不能运行,手动重启tomcat又可以用了。网上…

自动化测试的执行策略详解

前言 自动化测试的执行策略是指在自动化测试过程中,为了达到测试目标和要求,所采用的测试执行方案和策略。 执行策略涉及到测试用例的执行顺序、方式、环境、频率等方面的决策。 同时,我也准备了一份软件测试视频教程(含接口、…

WSL2下的Docker配置和使用

在Windows的Linux子系统(Windows Subsystem for Linux)WSL2中安装、配置和使用 Docker,可以参考官方教程:WSL上的Docker远程容器入门. 重要步骤总结如下: 先决条件 确保你的计算机运行的是 Windows 10(更…

【2023年新版】40套BIM+GIS项目案例合集,中建中铁中交企业内部学习资源免费领取

最近有很多做工程的朋友想要学习BIMGIS技术,向我询问相关的学习资源和资料。他们面临的普遍问题是不知道如何入门,找到的资料很多,但是很多却用不上。 为了解决大家的问题,我们团队花了近一个月的时间,精心整理了一份…

重庆建筑模板厂家有哪些?

重庆地区的建筑施工企业在寻找可靠的建筑模板供应商时,广西贵港市能强优品木业是一个备受推崇的选择。作为建筑模板生产的优秀供应商之一,能强优品木业不仅能提供高质量的建筑模板,还可提供整车物流包运输,并将货物发货至重庆各地…

【算法|双指针系列No.6】leetcode LCR 179. 查找总价格为目标值的两个商品

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

电脑重做系统---win10

电脑重做系统---win10 前言制作启动U盘材料方法打开网址下载启动盘制作工具参照官方说明进行制作使用U盘重做系统 常用软件官网地址 前言 记得最早学习装电脑还是04年左右,最为一个啥也不知道的大一傻白胖,花了几百大洋在电脑版把了个“电脑组装与维修”…

日语学习网站web项目

支持日语五十音,平片假名、罗马音、词义转换、百度翻译功能,方便日语初学者学习日语发音 介绍 采用vitevue3ts技术栈开发, pinia管理全局化。主要是为了日语入门学习五十音, 以及日语句子罗马 发音对照练习。 参考以下两个项目完成 https://github.com/hexenq/kuroshiro ht…