设计模式之适配器模式(Adapter)

一、适配器模式介绍

        适配器模式(adapter pattern )的原始定义是:将类的接口转换为客户期望的另一个接口,

        适配器可以让不兼容的两个类一起协同工作。 

        适配器模式是用来做适配,它将不兼容的接口转换为可兼容的接口,让原本由于接口

        不兼容而不能一起工作的类可以一起工作。适配器模式有两种实现方式:类适配器和

        对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。

        类适配器模式的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部

        结构,所以应用相对较少些。

二、适配器模式原理

       适配器模式(Adapter)包含以下主要角色:

             1)目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。

             2)适配者(Adaptee)类:适配者即被适配的角色,它是被访问和适配的现存组件库

                  中的组件接口。

            3)适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配

                  者接口转换成目标接口,让客户按目标接口的格式访问适配者。

       类适配器类一般是继承 “适配者类(适配者的具体实现)” 并实现目标接口,而对象适配器

       器类一般是在适配器类中引用适配者类对象;适配器模式结构图如下:

       类适配器模式结构图:

              

       对象适配器模式结构图:

               

三、适配器模式应用示例

        以电脑目前只能读取SD卡的信息为例来看下适配器模式的使用
        一台电脑目前只能读取SD卡的信息,这时我们想要使用电脑读取TF卡的内容, 就需要将TF卡

        加上卡套,转换成SD卡,最后将TF卡中的内容读取出来

1、类适配器模式实现

      实现方式:

             类适配器类继承 “适配者类的具体实现(即TFCardImpl)” 并实现目标接口SDCard

      UML类图如下:

              

      具体代码实现如下:

/*** 类适配器* 以电脑目前只能读取SD卡的信息为例来看下适配器模式的使用* 一台电脑目前只能读取SD卡的信息,这时我们想要使用电脑读取TF卡的内容, 就需要将TF卡加上卡套,转换成SD卡** SD卡接口--目标(Target)接口*/
public interface SDCard {//读取SD卡方法String readSD();//写入SD卡功能void writeSD(String msg);
}/******************************************************** SD卡实现类*********************************************************/
public class SDCardImpl implements SDCard{@Overridepublic String readSD() {String msg = "sd card reading data";return msg;}@Overridepublic void writeSD(String msg) {System.out.println("sd card write data : " + msg);}
}/*** TF卡接口--适配者*/
public interface TFCard {//读取TF卡方法String readTF();//写入TF卡功能void writeTF(String msg);
}/******************************************************** TF卡实现类** *******************************************************/
public class TFCardImpl implements TFCard{@Overridepublic String readTF() {String msg = "tf card reading data";return msg;}@Overridepublic void writeTF(String msg) {System.out.println("tf card write data : " + msg);}
}/******************************************************** 定义适配器类,让SD卡兼容TF卡* 类适配器--通过继承来实现适配********************************************************/
public class SDAdapterTF extends TFCardImpl implements SDCard{@Overridepublic String readSD() {System.out.println("adapter read tf card ");return readTF();}@Overridepublic void writeSD(String msg) {System.out.println("adapter write tf card");writeTF(msg);}
}******************************************************** 电脑类,* 电脑类只能读取sd卡********************************************************/
public class Computer {public String read(SDCard sdCard){return sdCard.readSD();}
}//测试
public class Test {public static void main(String[] args) {Computer computer = new Computer();SDCard sdCard = new SDCardImpl();System.out.println(computer.read(sdCard));System.out.println("========================");SDAdapterTF adapterTF = new SDAdapterTF();System.out.println(computer.read(adapterTF));}
}

2、对象适配器模式实现

      实现方式:

             对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中,该类同时实

             现当前系统的业务接口。

      对象适配器模式UML类图如下:

              

      代码实现:

            在类适配器模式的代码基础上我们只需要修改 “适配器类” 就可以了,具体代码如下:

            

/******************************************************** 适配器类* 对象适配器类--通过组合的方式来实现适配********************************************************/
public class SDAdapterTF2 implements SDCard {private TFCard tfCard;public SDAdapterTF2(TFCard tfCard){this.tfCard = tfCard;}@Overridepublic String readSD() {System.out.println("adapter read tf card ");return tfCard.readTF();}@Overridepublic void writeSD(String msg) {System.out.println("adapter write tf card");tfCard.writeTF(msg);}
}

四、适配器模式总结

1、适配器模式优点

      1)将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无序修改原有结构

      2)增加了类的透明性和复用性,将具体业务实现过程封装在适配者类中,对于客户端类而言

            是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。

      3)灵活性和扩展性都非常好,通过使用配置文件可以很方便的更换适配器,也可以在不修改

            原有代码的基础上增加新的适配器类,符合开闭原则。

     

2、适配器模式缺点

2.1、类适配器的缺点

      1)对于Java等不支持多重继承的语言,一次最多只能适配一个适配者类,不能同时适配

            多个适配者

      2)适配者类不能为最终类,即不能被关键字final修饰

2.2、对象适配器的缺点

      1)与类适配器模式相比较,在该模式下要在适配器中置换适配者类的某些方法比较麻烦。

3、适配器模式适用场景

      1)统一多个类的接口设计时:

            某个功能的实现依赖多个外部系统(或者说类)。通过适配器模式,将它们的接口适配为

            统一的接口定义

      2)需要依赖外部系统时:

            当我们把项目中依赖的一个外部系统替换为另一个外部系统的时候,利用适配器模式,可

            以减少对代码的改动

      3)原有接口无法修改时或者原有接口功能太老旧但又需要兼容时:

            如JDK1.0 Enumeration 到 Iterator 的替换,适用适配器模式保留 Enumeration 类,并将

           其实现替换为直接调用 Itertor

      4)适配不同数据格式时:

            如Slf4j 日志框架,定义打印日志的统一接口,提供针对不同日志框架的适配器

4、代理、桥接、装饰与适配4种设计模式的区别

      代理、桥接、装饰器、适配器,这 4 种模式是比较常用的结构型设计模式。它们的代码结构

      非常相似。但其各自的用意却不同,简单说一下它们之间的关系:

      1)代理模式:

           代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,

           而非加强功能,这是它跟装饰器模式最大的不同。

      2)桥接模式:

            桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地

            加以改变。

      3)装饰器模式:

           装饰者模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的

           嵌套使用。

      4)适配器模式:

           将一个类的接口转换为客户希望的另一个接口。适配器模式让那些不兼容的类可以一起工作

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

2024Java最新面试题总结(针对于一些小厂、中厂)

这是根据个人面试经历总结出来的一些经验希望可以帮助到有需要的人。 面试的时候,会先让你进行自我介绍,这个大家准备一两分钟的面试稿就可以。然后就是正式面试,面试官一般是两个人以上,开始,面试官会先提问一些基本…

GRASP七大基本原则+纯虚构防变异

问题引出 软件开发过程中,需要设计大量的类,使他们交互以实现特定的功能性需求。但是不同的设计方式,对程序的非功能性需求(可扩展性,稳定性,可维护性等)的实现程度则完全不同。 有没有一种统一…

C++核心编程和桌面应用开发 第八天(继承)

目录 1.继承 1.1继承语法 1.2继承方式 1.3继承中的对象模型 1.4继承中的构造和析构 1.5继承中的同名成员处理 1.5.1同名属性处理 1.5.2同名成员函数处理 1.6继承中的同名静态成员处理 1.6.1同名静态成员属性处理 1.6.2同名静态成员函数处理 1.7多继承 1.继承 1.1继…

『网络游戏』自适应制作登录UI【01】

首先创建项目 修改场景名字为SceneLogin 创建一个Plane面板 - 将摄像机照射Plane 新建游戏启动场景GameRoot 新建空节点重命名为GameRoot 在子级下创建Canvas 拖拽EventSystem至子级 在Canvas子级下创建空节点重命名为LoginWnd - 即登录窗口 创建公告按钮 创建字体文本 创建输入…

数据结构——栈与队列的实现(全码)

一 栈的概念 栈是一种特殊的线性表,栈内数据遵循先进后出(LIFO)的原则,对于栈,只能在同一侧进行入栈和出栈操作。 入栈操作和出栈操作是在栈的同一侧进行的,如图示: 对于栈这种数据类型,我们可以采用链表或…

GSLAM——一个通用的SLAM架构和基准

GSLAM: A General SLAM Framework and Benchmark 开源地址 摘要: SLAM技术最近取得了许多成功,并吸引了高科技公司的关注。然而,如何同一现有或新兴算法的界面,一级有效地进行关于速度、稳健性和可移植性的基准测试仍然是问题。本…

数据库-分库分表

什么是分库分表 分库分表是一种数据库优化策略。 目的:为了解决由于单一的库表数据量过大而导致数据库性能降低的问题 分库:将原来独立的数据库拆分成若干数据库组成 分表:将原来的大表(存储近千万数据的表)拆分成若干个小表 什么时候考虑分…

mybatis自定义类型处理器

mybatis自定义类型处理器 其实使用MySQL或Oracle数据库很少会遇到自定义类型处理器的情况,之前是因为项目中使用了PGSQL才接触到这块的,这里简单做一下记录 要创建一个自定义的类型处理器,就需要继承BaseTypeHandler类或者实现TypeHandler接…

深度学习--------------------------------使用注意力机制的seq2seq

目录 动机加入注意力Bahdanau注意力的架构 总结Bahdanau注意力代码带有注意力机制的解码器基本接口实现带有Bahdanau注意力的循环神经网络解码器测试Bahdanau注意力解码器该部分总代码 训练从零实现总代码简洁实现代码 将几个英语句子翻译成法语该部分总代码 将注意力权重序列进…

CVSS 4.0 学习笔记

通用漏洞评分系统(CVSS)捕获了主要技术软件、硬件和固件漏洞的特征。其输出包括数字分数,表明与其他漏洞。 以下因素可能包括但不限于:监管要求、客户数量受影响、因违约造成的金钱损失、生命或财产受到威胁,或潜在漏洞的声誉影响。这些因素在CVSS评估范围之外。 CVSS的好…

基于PHP猫咖私人影院系统【附源码】

效果如下: 系统首页界面 用户注册界面 包厢信息界面 零食信息界面 管理员登录界面 包厢预订界面 猫咪信息界面 研究背景 近年来,随着生活品质的提升和个性化消费需求的增长,猫咖和私人影院等新兴休闲娱乐方式逐渐受到年轻人的青睐。猫咖结合…

招联金融校招内推2025

【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

复现文章:R语言复现文章画图

文章目录 介绍数据和代码图1图2图6附图2附图3附图4附图5附图6 介绍 文章提供画图代码和数据,本文记录 数据和代码 数据可从以下链接下载(画图所需要的所有数据): 百度云盘链接: https://pan.baidu.com/s/1peU1f8_TG2kUKXftkpYq…

人机协作:科技与人类智慧的融合

随着科技的飞速发展,越来越多的领域开始借助人工智能(AI)和自动化技术来提升工作效率。人机协作(Human-Machine Collaboration)这一概念逐渐成为现代技术进步的核心。它不仅改变了我们的工作方式,也在重新定…

基于SpringBoot“花开富贵”花园管理系统【附源码】

效果如下: 系统注册页面 系统首页界面 植物信息详细页面 后台登录界面 管理员主界面 植物分类管理界面 植物信息管理界面 园艺记录管理界面 研究背景 随着城市化进程的加快和人们生活质量的提升,越来越多的人开始追求与自然和谐共生的生活方式&#xf…

基于YOLOv8-deepsort算法的智能车辆目标检测车辆跟踪和车辆计数

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…

中国当代哲学家思想家教育家颜廷利:真正问题意识体现在哪些方面

在《升命学说》这部划时代的著作中,二十一世纪的杰出哲学家颜廷利教授提出了一个引人深思的观点。他巧妙地将阿拉伯数字“5”与汉字“吾”联系起来,指出两者发音相似,而“吾”字代表着自我。在儿童识字教学中,教师们常以创意的方式…

Linux操作系统——概念扫盲I

目录 虚拟机概念刨析 在那之前,询问什么是虚拟化? 现在来看看什么是虚拟机 虚拟机有啥好的 小差:那JVM也叫Java Virtual Machine,有啥区别呢? Reference 虚拟机概念刨析 我们下面来简单聊聊虚拟机这个概念。对于…

物联网开发者必读:从HTTP到MQTT,八大协议全解码!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello 大家好,我是小米,一个喜欢研究和分享技术的IT宅。今天咱们聊点不一样的——物联网(IoT)中的各种协议!最近在研究IoT的过程中,我发现物联网领…

基于ssm vue uniapp实现的爱心小屋公益机构智慧管理系统

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然…