设计模式结构型模式之适配器模式

news2024/9/30 22:45:57

结构型模式之适配器模式

  • 一、概述和使用场景
    • 1、概述
    • 2、使用场景:
    • 3、主要分类
  • 二、 代码示例
    • 1、类适配器模式
    • 2、接口适配器
    • 3、对象适配器
  • 四、总结
    • 1、适配器模式
    • 2、适配器模式的优点
    • 3、适配器模式的缺点

一、概述和使用场景

1、概述

适配器模式是一种结构型设计模式,它允许不兼容的接口之间进行适配,使得原本无法一起工作的类可以协同工作。适配器模式通过引入一个适配器类,将一个类的接口转换成客户端所期待的接口,从而使原本由于接口不兼容而不能一起工作的两个类能够协同工作。

2、使用场景:

  1. 当需要将一个类的接口转换成客户端所期待的另一个接口时,可以使用适配器模式。例如,如果一个类库中的某个接口与你的代码中所需的接口不一致,可以创建一个适配器类来将两者之间进行适配。
  2. 当需要复用一些已经存在的类,但是它们的接口与你的代码所需的不兼容时,可以使用适配器模式。通过创建适配器类,可以将已有的类的接口转换成你所需要的接口。
  3. 当需要通过适配器让多个类协同工作时,可以使用适配器模式。通过引入适配器类,可以统一多个类的接口,使它们可以协同工作。

3、主要分类

类适配器模式、接口适配器模式、对象适配器模式

二、 代码示例

下面是一个简单的Java代码示例,展示了适配器模式的使用:

1、类适配器模式

定义一个被适配的对象(将被改造的对象) ApplePhone

package org.storemanage.regestercenter.adaptormode;

/**
 * @CreateTime: 2024-08-29
 * @Description: 苹果手机(被适配的对象)
 * @Version: 1.0
 * @Author: hkf
 */

public class ApplePhone {

    private String name ;

    public void usbCable(){
        System.out.println("苹果充电器!!");
    }
}

安卓手机将要被改造的对象 AndroidPhone

package org.storemanage.regestercenter.adaptormode;

/**
 * @CreateTime: 2024-08-29
 * @Description: 安卓手机(适配的对象)
 * @Version: 1.0
 * @Author: hkf
 */

public interface AndroidPhone {


    //充电
    void usbCable();
}

创建一个适配器类 PhoneAdaptor ,将苹果手机的充电器改为能被安卓手机使用的充电器

package org.storemanage.regestercenter.adaptormode;

/**
 * @CreateTime: 2024-08-29
 * @Description: 手机转换适配器
 * @Version: 1.0
 * @Author: hkf
 */
public class PhoneAdaptor extends ApplePhone  implements  AndroidPhone   {
    @Override
    public void usbCable() {
        System.out.println(" 买个数据转换器 现在是安卓手机充电器!!");
    }
}

创建一个安卓手机对象

package org.storemanage.regestercenter.adaptormode;

/**
 * @CreateTime: 2024-08-29
 * @Description: 安卓手机对象,方便调用
 * @Version: 1.0
 * @Author: hkf
 */

public class Phone {

    //定义一个安卓手机的使用
    public void AndroidUsb(AndroidPhone androidPhone) {
        androidPhone.usbCable();
    }
}

用户 UserClient 用转换过后的苹果充电线充电(现在是适用安卓的充电线)

package org.storemanage.regestercenter.adaptormode;

/**
 * @CreateTime: 2024-08-29
 * @Description: 用户
 * @Version: 1.0
 * @Author: hkf
 */
public class UserClient {
    public static void main(String[] args) {
        //证明目前这个苹果充电器已经转换为安卓充电器
        Phone phone = new Phone();
        phone.AndroidUsb(new PhoneAdaptor());
    }
}

2、接口适配器

下面是一个简单示例的Java代码,展示了如何实现接口适配器模式:

// 目标接口
interface TargetInterface {
    void method1();
    void method2();
    void method3();
}

// 接口适配器类
abstract class InterfaceAdapter implements TargetInterface {
    @Override
    public void method1() {
        // 默认实现
    }

    @Override
    public void method2() {
        // 默认实现
    }

    @Override
    public void method3() {
        // 默认实现
    }
}

// 具体适配器类
class ConcreteAdapter extends InterfaceAdapter {
    @Override
    public void method2() {
        // 重写method2
        // 实现适配的逻辑
    }
}

// 测试代码
public class AdapterExample {
    public static void main(String[] args) {
        // 创建具体适配器对象
        TargetInterface adapter = new ConcreteAdapter();

        // 调用目标接口方法
        adapter.method1();
        adapter.method2(); // 已经在适配器中实现了适配的逻辑
        adapter.method3();
    }
}

在这个示例中,有一个目标接口 TargetInterface,其中定义了三个方法 method1()method2()method3()。然后,创建了一个接口适配器 InterfaceAdapter,该适配器实现了 TargetInterface 接口,并提供了默认的方法实现。最后,创建了一个具体适配器类 ConcreteAdapter,该适配器重写了 method2() 方法,并实现了适配的逻辑。

在测试代码中,创建了一个具体适配器对象 adapter,并通过该对象调用了目标接口的方法。在调用 adapter.method2() 时,会执行具体适配器 ConcreteAdapter 中的实现逻辑,而不是使用默认的实现。```

3、对象适配器

以下是一个简单的对象适配器的 Java 代码示例:

// 目标接口
interface Target {
    void request();
}

// 适配者类
class Adaptee {
    public void specificRequest() {
        System.out.println("适配者的方法被调用");
    }
}

// 对象适配器类
class ObjectAdapter implements Target {
    private Adaptee adaptee;

    public ObjectAdapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 客户端类
public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new ObjectAdapter(adaptee);
        target.request();
    }
}

这个示例中,目标接口 Target 定义了客户端所需的方法 request()。适配者类 Adaptee 是一个已存在的类,其中包含了一个可以被调用的方法 specificRequest()。对象适配器 ObjectAdapter 实现了 Target 接口,并在其内部持有一个 Adaptee 对象。在 ObjectAdapterrequest() 方法中,通过调用 adaptee.specificRequest() 实现了适配器模式。最后,在客户端 Client 中创建了一个适配者对象和一个适配器对象,并调用适配器的 request() 方法来完成客户端的需求。

四、总结

1、适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许现有的类与其他类或接口进行协作,解决了类之间接口不兼容的问题。

2、适配器模式的优点

  1. 透明性:适配器模式可以使客户端代码不需要修改就能与新的接口协作,提高了代码的可维护性和可复用性。
  2. 扩展性:适配器模式可以在不修改现有代码的情况下添加新的适配器类,满足未来可能的需求变化。
  3. 重用性:适配器模式可以重用现有的类,以适应不同的接口需求。
  4. 灵活性:适配器模式可以根据需要选择合适的适配器类,实现不同的适配需求。

3、适配器模式的缺点

  1. 增加代码复杂性:适配器模式需要新建适配器类,并编写适配器代码,增加了代码的复杂性和阅读性。
  2. 运行效率低:由于适配器模式的存在,导致系统中多了一层间接调用,可能会对系统的性能有所影响。

总的来说,适配器模式是一种在接口不兼容的情况下,实现两个不同接口间的协作的有效方式,但在使用时需要权衡代码复杂性和运行效率。
在这里插入图片描述

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

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

相关文章

会声会影分离的音频怎么导出 会声会影分离音频后如何合并 视频剪辑制作教程软件

出色的音频编辑,可以显著提升剪辑作品的质量。一款优秀的视频剪辑软件,必定拥有强大的音频编辑能力。以会声会影视频剪辑软件为例,它不仅具备丰富的音频编辑功能,还允许用户自定义音频导出参数。有关会声会影分离的音频怎么导出&a…

深入学习SQL优化的第五天(最后一天)

子查询 1321 餐 馆 营 业 额 变 化 增 长 1321. 餐馆营业额变化增长 表: Customer------------------------ | Column Name | Type | ------------------------ | customer_id | int | | name | varchar | | visited_on | date | | amount …

【曾哥分享-1】云 WAF 绕过

幕布链接:【曾哥分享-1】云 WAF 绕过 - 幕布

【DSP+FPGA】基于Virtex-7 FPGA + C6678 DSP的高性能实时信号处理平台

DSP FPGA 协同处理架构板载 1 个TMS320C6678 多核DSP处理节点板载 1 片 XC7VX690T FPGA处理节点板载 1 个FMC 接口板载4路SFP光纤接口FPGA 与 DSP 之间采用高速Rapid IO互联 基于Virtex-7 FPGA的高性能实时信号处理平台,该平台采用1片TI的KeyStone系列多核DSP TMS3…

【DSP+FPGA】基于2 个TMS320C6678+ XC7VX690T FPGA 的6U VPX 总线架构的高性能实时信号处理平台

6U VPX架构,符合VITA46规范板载 2 个TMS320C6678 多核DSP处理节点板载 1 片 XC7VX690T FPGA处理节点板载 2 个FMC 接口背板之间具有 4 路 x4 高速 GTH 互联,支持RapidIO、PCI ExpressFPGA 与 DSP 之间采用高速Rapid IO互联 基于6U VPX架构的高性能实时信…

变分自编码器(Variational Autoencoder, VAE):深入理解与应用

变分自编码器(Variational Autoencoder, VAE):深入理解与应用 在深度学习的广阔领域中,生成模型一直是研究的热点之一。其中,VAE(变分自编码器)作为AE(自编码器)的一种扩…

Java | Leetcode题解之第383题赎金信

题目: 题解: class Solution {public boolean canConstruct(String ransomNote, String magazine) {if (ransomNote.length() > magazine.length()) {return false;}int[] cnt new int[26];for (char c : magazine.toCharArray()) {cnt[c - a];}for…

华为集合通信库开源了!HCCL开源链接、架构、拓扑算法、常用接口

激动啊!我们华为HCCL终于开源了! 视频分享在这: 华为集合通信库开源了!HCCL开源链接、拓扑算法、常用接口_哔哩哔哩_bilibili 一、HCCL相关链接 源码位置(需注册华为账号才可下载) cann-hccl: cann-hc…

渲染引擎实践 - UnrealEngine引擎中启用 Vulkan 和使用 Renderdoc 抓帧

一:方法一: 1. 到 .\Engine\UE_5.2\Engine\Binaries\Win64 目录下(以Windows平台为例),找到UnrealEditor, 并创建桌面快捷方式。 2. 右键快捷方式,配置运行参数: -vulkan -AttachRenderDoc 二…

vulhub xxe靶机攻击教程

使用御剑目录扫描工具测试一下,发现有robots.txt文件 访问robots.txt文件,这个文件通常放的是一个网站的目录 我们得到两个目录,试着访问一下 xxe目录下是一个登录页面,xxe/admin.php目录下也是一个登录页面 我们先在xxe页面进行…

idea未加载Marketplace插件问题

今天想用idea安装一些插件,结果迟迟加载不出来 直到我将网络换成手机热点突然就好了,还真的是网络的问题

LIN诊断(2)—— 在CANoe软件中,加载cdd/pdx等诊断数据库时,切换调度表的不同方式选择

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

cesium 发光线

发光线也是一种比较常见的可视化效果,cesium 内置的材质已经提供了PolylineGlowMaterialProperty类,实现了发光效果。这种材质在线的中间部分始终会有白色线条,如果想实现纯色的发光线,就需要对这种材质进行改造。本篇通过自定义M…

VTK随笔十:VTK图形处理(封闭性检测、联通区域分析、多分辨率处理)

一、封闭性检测 如果一条边只被一个多边形包含,那么这条边就是边界边。 是否存在边界边是检测一个网格模型是否封闭的重要特征。 vtkFeatureEdges是一个非常重要的类,该类能够提取多边形网格模型中四种类型的边。 1)边界边。即只被一个多边形或者…

解释预测的艺术

如何以人性化的方式解释你的模型 可直接在橱窗里购买,或者到文末领取优惠后购买: 数据科学家职责的一个重要部分是解释模型预测。通常,接受解释的人不是技术人员。如果你开始谈论成本函数、超参数或 p 值,你将会遇到茫然的表情。我…

List集合和Set集合

Collection: Collection 不唯一,无序 List 不唯一,有序 Set 唯一,无序 ArrayList:内部使用长度可变的数组,遍历查询效率高 LinkedList:采用双向链表实现,增删改效率比较高 ArrayL…

【小白深度学习入门】【2】池化层详解:工作原理、维度计算、池化类型

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 👍感谢小伙伴们点赞、关注! 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

Dataworks_PySpark开发流程

PySpark是由Spark官方开发的Python语言第三方库,Python开发者可以通过使用python语言来编写Spark程序和SparkSQL完成开发。 之所以采用PySpark而不采用Java/Scala,是由于: Dataworks可通过将代码在线写入DataWorks Python资源的方式&#xf…

Android 12系统源码_输入系统(一)认识Android的输入系统

前言 问渠那得清如许,为有源头活水来。对于大多数现代操作系统中,“事件”就是它们的“活水源头”,正是在“事件和消息”的不断产生、流转和处理中,整个软件系统才能“动”起来。 Android系统有一套从底层Linux内核到上层应用程…

合宙LuatOS产品规格书——Air780EQ

合宙Air780EQ, 基于移芯EC716E高端平台, 集成LTE 3GPP Release 13技术,确保高速、稳定的网络连接; 广泛兼容各大运营商网络,实现真正的全网通设计,提升产品市场适应性与灵活性。 Air780EQ 4G全网通模块核…