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

news2024/10/7 12:36:06

一、适配器模式介绍

        适配器模式(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{
    @Override
    public String readSD() {
        String msg = "sd card reading data";
        return msg;
    }

    @Override
    public 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{
    @Override
    public String readTF() {
        String msg = "tf card reading data";
        return msg;
    }

    @Override
    public void writeTF(String msg) {
        System.out.println("tf card write data : " + msg);
    }
}


/*******************************************************
 * 定义适配器类,让SD卡兼容TF卡
 * 类适配器--通过继承来实现适配
 *
 *******************************************************/
public class SDAdapterTF extends TFCardImpl implements SDCard{

    @Override
    public String readSD() {
        System.out.println("adapter read tf card ");
        return readTF();
    }

    @Override
    public 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;
    }

    @Override
    public String readSD() {
        System.out.println("adapter read tf card ");
        return tfCard.readTF();
    }

    @Override
    public 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.coloradmin.cn/o/2194160.html

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

相关文章

YOLOv10改进,YOLOv10添加CA注意力机制,二次创新C2f结构,助力涨点

改进前训练结果: 二次创新C2f结构训练结果: 摘要 在本文中,提出了一种新的移动网络注意力机制,将位置信息嵌入到信道注意力中称之为“协调注意力”。与渠道关注不同通过 2D 全局池将特征张量转换为单个特征向量,坐标注意力因子将通道注意力转化为两个 1D 特征编码过程…

如何在AI时代成为优秀的AI产品经理?全面解析与全套学习路径分享!!!

前言 在当前人工智能技术飞速发展的时代背景下,AI产品经理无疑成为了职场中的一片蓝海。随着AI技术在各行各业的广泛应用,AI产品经理的角色变得越来越重要,成为了众多求职者眼中的优质赛道。那么,如何在AI的大环境下成为一名优秀…

李宏毅深度学习-自注意力机制

输入是向量序列的情况 在图像识别的时候,假设输入的图像大小都是一样的。但如果问题变得复杂,如图6.2所示,输入是一组向量,并且输入的向量的数量是会改变的,即每次模型输入的序列长度都不一样,这个时候应该…

搬砖 网盘一键转存源码

网盘一键转存源码,免费资源没测试 网盘一键转存源码,可以将您的百度网盘资源一键转存到。并支持后台设置开屏广告 源码截图: 下载地址: https://yuncv.lanzouw.com/i8dZk2btyl4h

六自由度机械重力补偿控制

1.动力学方程 六自由度机械臂动力学方程形式如下: 进行重力补偿,就是在驱动力矩中对重力G进行补偿,从而消除重力的影响,这样就能够在进行闭环控制的时候避免重力影响带来的大超调问题,使得机器人更好的实现轨迹跟踪控…

如何使用BlinkShot.io生成照片

在当今的数字时代,AI生成照片已经成为一项令人惊叹的技术。而BlinkShot.io就是这样一个平台,它可以让你轻松生成各种类型的照片。以下是详细步骤,教你如何使用BlinkShot.io生成照片。 第一步:访问网站 首先,打开Blin…

python调用父类同名成员

语法 print(f"父类的厂商是:{Phone.producer}“) Phone.call_by_5g(self) print(f"父类的厂商是:{super().producer}”) print(f"父类的序列号是:{super().IMEI}") super().call_by_5g() print(“关闭CPU单核模式&…

AIGC下的数据战略,助力还是阻力?

AIGC下的数据战略,助力还是阻力? 前言一、生成式AI的崛起与影响二、企业数据战略的关键要点(一)找准应用方向,激发创新价值(二)准备专有数据,确保数据安全(三&#xff09…

毕业设计项目(难度高)——文本驱动的可控人体动作生成方法(论文/代码)

完整的论文代码见文章末尾 以下为核心内容 摘要 本文实现了一种基于扩散模型的文本驱动的可控人体动作生成方法。本文利用先进的交叉模态线性变换器及细粒度控制技术,根据自然语言描述生成逼真的人体动作序列。扩散模型在生成高质量图像和视频方面有较大优点&…

爆火!最新大模型算法岗 100 道面试题全解析,赶紧收藏!

大模型应该是目前当之无愧的最有影响力的AI技术,它正在革新各个行业,包括自然语言处理、机器翻译、内容创作和客户服务等等,正在成为未来商业环境的重要组成部分。 截至目前大模型已经超过200个,在大模型纵横的时代,不…

【C++】多线程编程图文详解(多角度详解,小白一看就懂!!)

目录 一、前言 二、什么是C多线程? 💢线程与进程 💢并发与并行 💢多线程 三、 线程库 - thread 1. 线程对象的构造方式 无参构造 带可变参数包的构造 移动构造 2. thread类的成员函数 join 和 joinable deta…

基于SpringBoot+Vue的网约车管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

Diffusion models(扩散模型) 是怎么工作的

前言 给一个提示词, Midjourney, Stable Diffusion 和 DALL-E 可以生成很好看的图片,那么它们是怎么工作的呢?它们都用了 Diffusion models(扩散模型) 这项技术。 Diffusion models 正在成为生命科学等领域的一项尖端技术&…

.NET NoSQL 嵌入式数据库 LiteDB 使用教程

前言 今天大姚给大家分享一个小巧、快速、轻量级的.NET 开源且免费(MIT License)的 NoSQL 嵌入式数据库:LiteDB。本篇文章我们主要来讲讲LiteDB在.NET中如何使用。 LiteDB介绍 LiteDB 是一个小巧、快速和轻量级的 .NET NoSQL 嵌入式数据库…

python爬虫 - 初识requests模块

🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 前言 requests 是一个用于发送 HTTP 请求的 Python 库,设计简单且功能强大&am…

遥感滑坡目标检测数据集 2300张 滑坡 带标注 voc yolo 1类

遥感滑坡目标检测数据集 2300张 滑坡 带标注 voc yolo 1类 分类名: (图片张数, 标注个数) landsI ide: (2299,6545) 总数: (2314, 6545) 总类(nc): 1类 遥感滑坡目标检测数据集 (Remote Sensing Landslide Detection Dataset) 数据集概述 该…

【PS2020】Adobe Photoshop 2020 中文免费版

photoshop 2020是全球最大的图像处理软件,为用户提供了广泛的专业级润饰工具套件,集成了专为激发灵感而设计的强大编辑功能,帮助用户制作出满意的图片效果,是很多摄影师、广告师等专业人员必备的一款图像及照片后期处理大型专业软…

【机器学习】网络安全——异常检测与入侵防御系统

我的主页:2的n次方_ 随着全球互联网和数字基础设施的不断扩展,网络攻击的数量和复杂性都在显著增加。从传统的病毒和蠕虫攻击到现代复杂的高级持续性威胁(APT),网络攻击呈现出更加智能化和隐蔽化的趋势。面对这样的…

Spring Boot 进阶-浅析SpringBoot中如何完成数据校验

在实际开发中,我们经常会遇到接口数据校验的问题。例如在用户输入手机号、或者是身份证号的时候,我们就需要校验手机号或者身份证号是否输入正确。当然这样的校验在前端页面输入的时候就可以完成。 但是对于直接调用接口的情况则不能通过调用方来进行判断,这就需要我们在Spr…

c++继承(下)

c继承(下) (1)继承与友元(2)继承与静态成员(3)多继承及其菱形继承问题3.1 继承模型3.2 虚继承3.3 多继承中指针偏移问题 (4)继承和组合(9&#xf…