Java设计模式之结构型-适配器模式(UML类图+案例分析)

目录

一、概念

二、UML类图

1、类适配器

2、对象适配器

三、角色设计

四、代码实现

案例一

案例二

五、总结


一、概念

将一个类的接口转换为另一个接口,使得原本由于接口不兼容的类进行兼容。

适配器模式主要分为类适配器模式和对象适配器模式,前者类适配器模式之间的耦合度比后者更高,所以更推荐使用对象适配器。

二、UML类图

1、类适配器

2、对象适配器

三、角色设计

角色描述
目标接口(Target)客户所期待的接口
适配者类(Adaptee)它是被访问和适配的现存组件库中的组件接口
适配器(Adapter)通过包装一个需要适配的对象,把原接口转换为目标接口

四、代码实现

案例一

假设一个手机只支持5W的充电功率,如果充电功率大于5W,则不能进行充电,那我们就需要对大于5W的充电功率进行向下兼容适配,以下是代码实现过程。

1、先定义一个5W的目标接口Target


public interface Power5WTarget {public int outPut5W();}

2、这是我们需要适配的类Adaptee

public class Power60WAdaptee {public int outPut60W(){System.out.println("充电功率60W");return 60;}}

3、采用类适配器进行适配

public class ClassAdapter extends Power60WAdaptee implements Power5WTarget {@Overridepublic int outPut5W() {int power = super.outPut60W();return power/12;}}

 4、采用对象适配器进行适配

public class ObjAdapter implements Power5WTarget {private Power60WAdaptee power60WAdaptee;public ObjAdapter(Power60WAdaptee power60WAdaptee){this.power60WAdaptee = power60WAdaptee;}@Overridepublic int outPut5W() {int power = this.power60WAdaptee.outPut60W();return power/12;}
}

5、新建一个手机类

public class Phone {public void charging(Power5WTarget power5WTarget) {if(power5WTarget.outPut5W() == 5) {System.out.println("电压符合标准,允许充电!");} else if (power5WTarget.outPut5W() > 5) {System.out.println("电压过大,禁止充电!");}}
}

6、测试

    public static void main(String[] args) {Phone phone = new Phone();phone.charging(new ClassAdapter());phone.charging(new ObjAdapter(new Power60WAdaptee()));}

7、运行结果

案例二

假设由如下场景:由一个接口只支持USB接口进行手机充电,现在来了个无线充电的手机也想通过USB进行充电,这边我们就需要为无线充电做一个适配转换。

1、目标接口:客户所期待的Usb接口

public interface UsbTarget {void usb();}

2、要适配的类或适配者类

public class WirelessAdaptee {public void wireless(){System.out.println("无线充电...");}}

3、类适配器:通过包装一个需要适配的对象,把原接口转换成目标接口

public class ClassAdapter extends WirelessAdaptee implements UsbTarget{@Overridepublic void usb() {super.wireless();System.out.println("wireless -> usb");}}

4、对象适配器:通过包装一个需要适配的对象,把原接口转换成目标接口

public class ObjAdapter implements UsbTarget{private WirelessAdaptee wirelessAdaptee;public ObjAdapter(WirelessAdaptee wirelessAdaptee){this.wirelessAdaptee = wirelessAdaptee;}@Overridepublic void usb() {this.wirelessAdaptee.wireless();System.out.println("wireless -> usb");}}

5、测试运行

    public static void main(String[] args) {// 类适配器ClassAdapter classAdapter = new ClassAdapter();classAdapter.usb();// 对象适配器ObjAdapter objAdapter = new ObjAdapter(new WirelessAdaptee());objAdapter.usb();}

6、运行结果

五、总结

类适配器和对象适配器区别:

类适配器:单继承,一次最多只能适配一个适配者类

对象适配器:可以把多个不同的适配者适配到同一个目标

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

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

相关文章

android:RadioGroup的使用

一、前言:工作中会遇到勾选不同的类型,获得不同的数据。仅以此笔记记录。 二、上代码: 新建一个Activity public class RadioHorizontalActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {private Text…

conda、python与人工智能学习过程中的一些基础性问题

一个不知名大学生,江湖人称菜狗original author: Jacky LiEmail : 3435673055qq.com Time of completion:2023.6.30 Last edited: 2023.6.30 目录 pip install XXX与conda install XXX的区别 conda install xxx pip install xxx 为什么要建立虚拟环境…

Mysql架构篇--Mysql(M-M) 主从同步

文章目录 前言一、M-M 介绍:二、M-M 搭建:1.Master1:1.1 my.cnf 参数配置:1.2 创建主从同步用户:1.3 开启复制: 2.Master2:2.1 my.cnf 参数配置:2.2 创建主从同步用户:2.…

解决联网时自动打开浏览器转到必应msn网址的问题

现象 开机后或者断网重连之后,系统自动打开默认浏览器(不管是IE还是谷歌,或其他的浏览器)网址为http://go.microsoft.com/fwlink/?LinkID219472&clcid0x409接着转到http://cn.bing.com/ 或者 https://www.msn.com/ 解决方法…

ATA-3090功率放大器在新能源汽车上的应用

随着全球对环境保护和节能减排的重视,新能源汽车正逐渐成为汽车市场的主流。而功率放大器作为电子控制系统中的关键部件之一,也扮演着越来越重要的角色。那么,功率放大器在新能源汽车上的应用有哪些呢? 图:新能源汽车 …

Hyperledger Fabric架构设计

目录 1、逻辑架构 答疑:什么叫做背书策略? 2、运行时架构 答疑:什么是锚节点? 1、逻辑架构 Hyperledger Fabric从1.X开始,在扩展性及安全性方面有了很大的提升,且新增了诸多特性。 多通道:支…

C/C++ 线程池工作原理 代码实现

1. 线程池作用 如果多次使用线程,那么就需要多次的创建并撤销线程。但是创建/撤销的过程会消耗资源。线程池是一种数据结构,其中维护着多个线程,这避免了在处理短时间任务时,创建与销毁线程的代价。即在程序开始运行前预先创建一…

记录STM32使用udp通信的一个大坑

TOCfreeRTOSlwip实现udp通信 问题说明 在使用MCU和其他终端udp通信时遇见这样的一个大坑,整个通信过程如下图所示 问题出在mcu与其他设备通过udp交互,但在调试的过程中发现MCU给其他设备发消息的时候,虽然看起来成功了,但实际上…

支持刷机(OpenWrt)的路由器大全

2023年上半年最热门的刷机路由器当然是360T7、小米WR30U这两款,主要是性价比高,闲鱼100多搞定,支持刷OpenWrt、支持WiFi6,采用MTK798X系列处理器,性能强,轻松跑满千兆,如果你想追新,…

学习c++第01天

学习c的第01天 前言1、变量是声明&#xff1f;2.建议定义数据都对其进行初始化3.有符号数和无符号数4.进制间的相互转换5.原反补码6.const 、register 、volatile和typedef关键字7.数据类型的自动转换8.左移<< &右移操作>>9.将data的指定位数进行0、1转化的应用…

Unity | HDRP高清渲染管线学习笔记:HDRP Custom Pass

目录 一、Custom Pass Volume组件介绍 1.Mode&#xff08;模式&#xff09; 2.Injection Point&#xff08;注入点&#xff09; 3.Priority 4.Fade Radius 5.custom passes 二、查看Custom Pass的渲染阶段 Custom Pass允许你执行以下操作&#xff08;官方文档&#xff0…

基于改进ISODATA算法的负荷场景曲线聚类MATLAB程序

参考文献&#xff1a; 基于机器学习的短期电力负荷预测和负荷曲线聚类研究_张辰睿&#xff08;硕士论文&#xff09; 参考其第三章 主要内容&#xff1a; 主要包含四种聚类算法&#xff0c;K-means聚类、ISODATA聚类、L-ISODATA聚类及K-L-ISODATA聚类&#xff0c;并且包含了…