JAVA设计模式>>结构型>>适配器模式

本文介绍23种设计模式中结构型模式的适配器模式

目录

1.  适配器模式

1.1  基本介绍

1.2  工作原理

 1.3  适配器模式的注意事项和细节

1.4  类适配器模式

1.4.1  类适配器模式介绍

1.4.2  应用实例

 1.4.3 注意事项和细节

1.5  对象适配器模式

1.5.1  基本介绍

1.5.2 应用实例

 1.5.3  注意事项和细节


1.  适配器模式

1.1  基本介绍

        1) 适配器模式(Adapter Patern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装(Wrapper)

        2) 适配器模式属于结构型模式

        3) 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式


 

1.2  工作原理

        1) 适配器模式:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容,其别名为包装器

        2) 从用户的角度看不到被适配者,是解耦的

        3) 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法

        4)用户收到反馈结果,感觉只是和目标接口交互,如图


 

 1.3  适配器模式的注意事项和细节

        1) 三种命名方式,是根据 src是以怎样的形式给到Adapter(在Adapter里的形式)来命名的。

        2) 类适配器:以类给到,在Adapter里,就是将src当做类,继承

            对象适配器:以对象给到,在Adapter里,将src作为一个对象,持有

            接口适配器:以接口给到,在Adapter里,将src作为一个接口,实现

        3) Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作。

        4) 实际开发中,实现起来不拘泥于我们讲解的三种经典形式


 

1.4  类适配器模式

1.4.1  类适配器模式介绍

        基本介绍 : Adapter类,通过继承 src类,实现 dst类接口,完成src->dst的适配

1.4.2  应用实例

        1) 应用实例说明以生活中充电器的例子来讲解适配器,充电器本身相当于Adapter,220V交流电相当于src(即被适配者),我们的目dst(即 目标)是5V直流电

        2)思路分析图解

 

        3) 代码实现

        IVoltage5v 代码

public interface IVoltage5v {public int output5V();
}

       Voltage220V 代码

public class Voltage220V {//输出220Vpublic int output220V() {int src = 220;System.out.println("电压:" + src + "伏");return src;}
}

      VoltageAdapter 代码

//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5v{@Overridepublic int output5V() {// 获取220V电压int src = output220V();int dst = src / 44;System.out.println("适配器将" + src + "V的电压转换为" + dst + "V");return dst;}
}

        Client 代码

public class Client {public static void main(String[] args) {System.out.println("类适配器模式");Phone phone = new Phone();phone.charging(new VoltageAdapter());}
}

     Phone 代码

public class Phone {//手机充电public void charging(IVoltage5v iVoltage5v){if (iVoltage5v.output5V()==5){System.out.println("手机充电");}else if (iVoltage5v.output5V()>5){System.out.println("电压大于5v,电压不匹配");}}
}

        运行结果 


 

 1.4.3 注意事项和细节

        1)Java是单继承机制,所以类适配器需要继承src类这点算是一个缺点,因为这要求dst必须是接口,有一定局限性;

        2)src类的方法在Adapter中都会暴露出来,也增加了使用的成本。

        3)由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了。


 

1.5  对象适配器模式

1.5.1  基本介绍

        1)基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src类,而是持有src类的实例,以解决兼容性的问题。即:持有src类,实现 dst 类接口,完成src->dst的适配

        2)根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系

        3)对象适配器模式是适配器模式常用的一种

1.5.2 应用实例

        1) 以生活中充电器的例子来讲解适配器,充电器本身相当Adapter,220V交流电相当于src(即被适配者),我们的目dst(即目标)是5V直流电,使用对象适配器模式完成。

        2)类图

 代码实现

        IVoltage5v接口

public interface IVoltage5v {public int output5V() ;
}

        Voltage220V类

public class Voltage220V {//输出220V电压public int output220V(){//模拟int src = 220;System.out.println("电压:" + src + "伏");return src;}
}

        VoltageAdapter类

public class VoltageAdapter implements IVoltage5v{private final Voltage220V Voltage220V;//适配器需要一个5V电压//通过构造器,传入一个Voltage220V的实例public VoltageAdapter(Voltage220V voltage220V){this.Voltage220V=voltage220V;}@Overridepublic int output5V() {int dst = 0;if (Voltage220V !=null){int src = Voltage220V.output220V();//获取220V电压System.out.println("使用对象适配器,进行适配");dst = src/44;System.out.println("适配完成,输出电压为:"+dst);}return dst;}
}

        Phone类

public class Phone {public void charging(IVoltage5v iVoltage5v){if(iVoltage5v.output5V() == 5){System.out.println("电压为5V,可以充电");}else{System.out.println("电压不匹配,不能充电");}}
}

         Client类

public class Client {public static void main(String[] args) {System.out.println("使用对象适配器");Phone phone =new Phone();phone.charging(new VoltageAdapter(new Voltage220V()));}
}

         运行结果

 1.5.3  注意事项和细节

        1) 对象适配器和类适配器算是同一种思想,只不过实现方式不同.根据合成复用原则,使用组合替代继承,所以他解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口

        1) 使用成本低,更灵活


 

作者 : 2401_85014515

 博客 : 2401_85014515的博客_CSDN,JAVA知识,JAVA开发技术详解 (转载请声明出处)

        

       

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

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

相关文章

VUE+ELEMENTUI表格的表尾合计

<el-table :data"XXXX" :summary-method"getSummaries" show-summary "true" > getSummaries(param) { const { columns, data } param; const sums []; columns.forEach((column, index) > { if (index 0) { sums[index] 合计; }…

关于RiboSeq分析流程的总结

最近关注了一下RiboSeq的分析方法&#xff0c;方法挺多的&#xff0c;但是无论哪种软件&#xff0c;都会存在或多或少的问题&#xff0c;一点问题不存在的软件不存在&#xff0c;问题的原因出在&#xff0c;1.有的脚本是用python2编写的&#xff0c;目前python2已经不能用了 2.…

FFM(Field-aware Factorization Machine -领域感知的因子分解机)解析及举例

FFM&#xff08;Field-aware Factorization Machines&#xff09;模型是一种广泛应用于推荐系统、广告点击率预测等领域的机器学习模型。与传统的因子分解机&#xff08;FM&#xff09;相比&#xff0c;FFM模型考虑了不同特征字段之间的交互关系&#xff0c;从而能够更好地捕捉…

jdk17的一些特性和升级遇到的问题

特性 JEP 403: Strongly Encapsulate JDK Internals&#xff0c;增强jdk内部元素的保护 大多数开发用不到。升级jdk时&#xff0c;可能因为之前代码用了某些类&#xff0c;导致无法升级。 JEP 394: Pattern Matching for instanceof&#xff0c;instanceof模式匹配&#xff08;…

未履行出资义务,名义股东担何责任?

名义股东是否要对未履行出资义务承担责任&#xff1f;如果要担责&#xff0c;应该承担何种责任&#xff1f;近日&#xff0c;河南省西平县人民法院审结了一起股东损害公司债权人利益责任纠纷案。   2021年&#xff0c;经生效法律文书确认&#xff0c;B实业公司应支付A科技公司…

树莓派pico入坑笔记,dht11使用及温湿度表制作

目录 关于树莓派pico和circuitpython的更多玩法&#xff0c;请看树莓派pico专栏 用到的库adafruit_dht&#xff0c;需要导入pico才能使用&#xff0c;在这里下载 样例程序 进阶玩法&#xff0c;显示信息的温湿度计 屏幕使用见树莓派pico专栏的ssd1306oled屏幕使用 代码 效…

代码随想录算法训练营第34天

LeetCode 416. 分割等和子集 链接 class Solution { public:bool canPartition(vector<int>& nums) {vector<int> dp(10001, 0);int sum accumulate(nums.begin(), nums.end(), 0);if(sum % 2 1) {return false;}int target sum / 2;for(int i 0; i <…

Go 初始化一个字典

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

4K60无缝一体矩阵 HDMI2.0功能介绍

关于GF-HDMI0808S 4K60无缝一体矩阵的功能介绍&#xff0c;由于直接针对GF-HDMI0808S型号的具体信息较少&#xff0c;我将结合类似4K60无缝HDMI矩阵的一般功能特性和可能的GF-HDMI0808系列产品的特点来进行说明。请注意&#xff0c;以下信息可能不完全针对GF-HDMI0808S型号&…

HOW - 结合 Form 和 Schema 的数据验证方案(Shema Validation)

目录 示例安装示例代码解释 Schema Validation 产生背景和机制产生背景机制ZodYup 机制和工作原理结论 在 React 应用中&#xff0c;使用表单和 Schema Validation 可以有效地管理表单状态和验证输入数据。 示例 常见的库包括 Formik 和 Yup。Formik 用于管理表单状态&#x…

springboot+vue系统开发

链接: https://pan.baidu.com/s/1P1YpHAx9QOBPxjFZ9SAbig 提取码: u6f1

如何设计一个C语言面向结构体的内存数据库

内存数据库 一般所谓内存数据库&#xff0c;是指能够与应用运行在同一个进程内的数据库&#xff0c;也就是说能够被嵌入到进程内运行的数据库。 比较著名的内存数据库软件&#xff0c;例如&#xff0c;Sqlite&#xff1b;以及新生代的NOSql key-value数据库bdb(Berkeley DB)、…

Java基础(十九):集合框架

目录 一、Java集合框架体系二、Collection接口及方法1、添加2、判断3、删除4、其它 三、Iterator(迭代器)接口1、Iterator接口2、迭代器的执行原理3、foreach循环 四、Collection子接口1&#xff1a;List1、List接口特点2、List接口方法3、List接口主要实现类&#xff1a;Array…

GuLi商城-商品服务-API-品牌管理-统一异常处理

每个方法都加这段校验太麻烦了 准备做一个统一异常处理@ControllerAdvice 后台代码: package com.nanjing.gulimall.product.exception;import com.nanjing.common.exception.BizCodeEnum; import com.nanjing.common.utils.R; import lombok.extern.slf4j.Slf4j; import org…

【Linux】任务管理

这个任务管理&#xff08;job control&#xff09;是用在bash环境下的&#xff0c;也就是说&#xff1a;【当我们登录系统获取bashshell之后&#xff0c;在单一终端下同时执行多个任务的操作管理】。 举例来说&#xff0c;我们在登录bash后&#xff0c;可以一边复制文件、一边查…

adb 常用的命令总结

1、adb logcat 抓取日志 adb logcat > d:\log.txt Ctrlc 结束日志抓取 adb logcat -c > d:\log.txt 清空旧日志 发生Native Crash 时&#xff0c;抓取错误报告 adb logcat -b crash 抓取筛选后的日志&#xff1a; adb logcat -s AndroidRuntime > d:\log…

解析Java中1000个常用类:EnumSet类,你学会了吗?

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

CSS 单位中 px、em 和 rem 的区别?

在CSS中&#xff0c;px、em和rem是常用的长度单位&#xff0c;它们之间有一些区别&#xff1a; px&#xff08;像素&#xff09;&#xff1a; px是相对长度单位&#xff0c;它是相对于显示器屏幕分辨率的一个点的大小。 px单位是固定的&#xff0c;不会随着父元…

代码随想录算法训练营第五十二天(图论)| 98. 所有可达路径、深度优先搜索、广度优先搜索

邻接矩阵 邻接矩阵是一种使用二维数组来表示图的方法。矩阵中的元素表示节点之间是否存在边。如果存在边&#xff0c;则对应的矩阵元素为1&#xff08;或边的权重&#xff09;&#xff1b;否则为0。 特点&#xff1a; 空间复杂度高&#xff1a;无论图是否稀疏&#xff0c;邻…

前端Canvas入门——一些注意事项

创建渐变的三种方法&#xff1a; createLinearGradient() - 线性渐变 createRadialGradient() - 径向渐变&#xff08;放射性渐变&#xff09; createConicGradient() - 锥形渐变 这三种的核心观点都是&#xff1a; 创建一个gradient对象&#xff0c;然后调用addColorStop()方法…