聊聊适配器模式

news2024/9/28 3:25:58

目录

适配器模式概念

主要实现方式

主要组成

UML用例图

代码示例

生活场景

应用场景


适配器模式概念

适配器模式属于结构型设计模式,它的主要目的是将一个类的接口转换成客户端所期望的另一种接口形式,使得原本接口不兼容的类可以一起工作。

主要实现方式

  1. 类适配器。类适配器的实现需要支持多继承(如C++),因为该类型适配器是通过多继承被适配者和目标接口,由于目标接口可以是抽象类或者接口,被适配者可以是类或接口。所以两者都有可能是类。自然不适用于单继承。
  2. 对象适配器。对象适配器不需要多继承,单继承就行(如Java)。该类型适配器通过将被适配器者作为属性引用(就像Spring中的属性注入)。这种方式更加灵活,因为它不依赖于被适配者的具体实现,只需要知道它的接口即可。

主要组成

  1. 目标接口(target)。 客户端所期待的接口。目标接口可以是抽象类或接口,定义了客户端期望的方法。
  2. 被适配者(adaptee)。需要适配的类或接口。包含一些客户端可能需要的方法,但接口形式与客户端所期望的接口不兼容
  3. 适配器(adapter)。适配器类是核心,它将被适配者的接口转换成目标接口。主要有两种,类适配器对象适配器。通过实现目标接口,被适配者作为该类属性以及传入被适配者实例(适用对象适配器)或者继承被适配者类(适用类适配器),目的调用被适配者的方法。最终返回一个目标实例,也就是适配器实例,通过调用适配器中的方法,完成接口转换。

UML用例图

以对象适配器为例

代码示例

 以对象适配器为例,举个例子,生活中的插头有两脚的、三脚的,之间就需要转换。接下来使用代码将三脚转为两脚插头使用。

两脚插头接口(目标)

// 两脚插头接口
public interface TwoPinPlug {
    void connectionTwoPin();
}

三脚插头类(被适配者)

// 三角插头接口
public interface ThreePinPlug {
    void connectionThreePin();
}

// 三角插头实现
public class ThreePinPlugImpl implements ThreePinPlug {
    @Override
    public void connectionThreePin() {
        System.out.println("三角插头连接成功");
    }
}

适配器类

// 适配器类,将三脚转为两脚,实现两脚接口,成为两脚接口的子类
public class PlugPinAdapter implements TwoPinPlug {
    // 三角(源)属性注入
    private ThreePinPlug threePlug;
    // 有参构造,传入三脚(源)接口
    public PlugPinAdapter(ThreePinPlug threePlug) {
        this.threePlug = threePlug;
    }
    @Override
    public void connection() {
        // 调用三脚(源)接口
        threePlug.connection();
        System.out.println("通过适配器转换...");
        System.out.println("转换成为两脚插头");
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        // 创建一个三脚插头实例
        ThreePinPlugImpl threePlug = new ThreePinPlugImpl();
        // 创建插头适配器,传入三脚插头实例,返回两脚插头实例
        TwoPinPlug twoPinPlug = new PlugPinAdapter(threePlug);
        // 执行两脚插头实例方法(其实也是适配器中的方法)
        twoPinPlug.connectionTwoPin();
    }
}

结果

生活场景

  1. 耳机转换头:现在有的手机是没有耳机插孔的,但是充电的地方其实也可以充当耳机孔,这时候就需要耳机转换的适配器,转成手机支持的插孔。
  2. 电压转换器:生活中常见的充电器,就是将220V电压转换成充电设备支持的电压。

应用场景

  1. JDBC驱动程序:不同的数据库提供商实现了不同的JDBC驱动接口,使用适配器模式可以将这些不同的接口适配为标准的JDBC接口,提高应用程序的可移植性
  2. 处理器适配器(HandlerAdapter):SpringMVC工作流程中的出现的处理器适配器(HandlerAdapter),前端控制器(DispatcherServlet)会根据找到的处理器,选择一个合适的HandlerAdapter。HandlerAdapter有多个实现,用于适配不同类型的处理器。在这个过程中,处理器适配器(HandlerAdapter)起到了桥梁的作用,它连接了DispatcherServlet和具体的处理器(Controller),使得不同类型的处理器能够被统一调用和执行。

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

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

相关文章

【New SQL】 -- CockroachDB license change

1、CockroachDB 发布了修改开源协议的 releases 北京时间 2024-08-16 ,CockroachDB 发布了修改开源协议的 releases。 原文链接:Licensing FAQs Evolving our self-hosted offering and license model CockroachDB License change (again) | Product T…

Kali Linux 定制化魔改 添加常见60渗透工具

项目地址:https://github.com/CuriousLearnerDev/kali-linux-kde-beautify 系统版本:kali linux 2024.1 固件类型:BIOS 用户: zss 密码: ss 完整版 系统压缩大小:18.8 GB 解出来:36.00GB 左右 系统版 系统压缩大小&…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 04路由协议的选择

本章要回答的问题: 路由是如何工作的?有哪些类型的路由协议?Clos 拓扑中的路由协议是如何工作的?什么是无编号接口,以及为什么无编号接口如此重要?如何确定最适合自己需求的路由协议? 路由概述 用最简单的话来说,路由是使用数据包的目…

DESeq2差异基因分析和批次效应移除

差异基因鉴定 基因表达标准化 不同样品的测序量会有差异,最简单的标准化方式是计算counts per million (CPM),即原始reads count除以总reads数乘以1,000,000。 这种计算方式的缺点是容易受到极高表达且在不同样品中存在差异表达的基因的影响&#xff…

FunClip,音视频识别,自动化剪辑,文本校对,智能纠错,导出SRT

今天给大家介绍一个自动化剪辑项目——FunClip,该项目是由阿里开源的,可以识别音频、视频中的文字,一键剪辑和添加字幕。 FunClip是一款高效的自动化视频剪辑工具,它利用语音识别技术对视频内容进行分析。用户可以在识别结果中选择所需的文本…

重生奇迹MU 梦幻骑士 真正生而高贵的职业

作为重生奇迹MU梦幻骑士中真正生而高贵的职业,圣骑士是玩家们最为追捧的职业之一。在游戏内,圣骑士拥有着强大的防御和治疗能力,成为团队中不可或缺的存在。如果你正准备选择一个强大的职业,那么不妨考虑成为一名圣骑士&#xff0…

选择文件摆渡系统要遵守的“三要”和“三不要”原则

文件摆渡系统不仅可以实现企业网络隔离后的数据摆渡需求,同时也可以视作企业数据安全及网络安全建设的重要组成部分。文件摆渡系统的选择也很关键,在企业进行筛选时,应该遵守“三要”和“三不要”原则。 “三要”之一:要安全 文件…

MySQL对事务的支持

5.MySQL对事务的支持情况: 5.1. 查看存储引擎对事务的支持情况 : 1.SHOW ENGINES 命令来查看当前 MySQL 支持的存储引擎都有哪些,以及这些存储引擎是否支持事务2.下图可以能看出在 MySQL 中,只有InnoDB类型的存储引擎是支持事务…

轻松搞定 Java7 新特性,示例丰富

Java 7 是 Java 语言的一个主要版本,于 2011 年 7 月 28 日正式发布。 由 Sun Microsystems 开发并由 Oracle 公司发布的一个重要版本,它带来了许多新功能特性,增强了编程语言的能力和性能。 以下是一些 Java 7 的主要新功能特性&#xff1…

基于SSM的体育馆预约管理系统---附源码84196

摘 要 体育馆作为一个重要的运动场所,需要进行预约管理以保证资源的合理利用和场馆秩序的维护。传统的人工预约管理方式存在效率低、容易出错等问题,因此,在互联网高速发展的当下,需要设计和实现一个基于SSM的体育馆预约管理系统&…

关于LLC知识9

1、上图有多条增益曲线,是每种不同的输出负载都对应一条增益曲线,在f1时候每个曲线都汇聚一点,说明只要输出电压频率f1时,不论输出负载是多少,增益是一样的,不受负载影响G1(Lr与Cr发生谐振&…

[单master节点k8s部署]21.EFK日志收集平台介绍

大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情 况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高 定位问题的效率…

构建自己的语音助手

在我最近发布关于如何构建自己的 RAG 并在本地运行它的帖子之后。今天,我们更进一步,不仅实现了大型语言模型的对话能力,还增加了听力和口语能力。这个想法很简单:我们将创建一个语音助手,让人想起标志性钢铁侠电影中的…

基于asp.net的办公协同管理系统源码分享

今天给大家分享一个asp.net开发的webform框架的办公协同管理系统源码SQLserver数据库 1.主要功能 这个项目是帮助一个学生指导的毕业设计,包含用户登陆、用户管理、车辆 管理、文件管理、个人中心、后台管理、文件上传、人事管理、系统日志等 等模块。2.开发工具及…

【Django-vue-admin学习笔记】页面自动计算日期差额的方法

在许多应用场景中,尤其是在管理系统中,经常需要对日期进行动态计算和展示,以帮助用户了解关键日期的即时状态。例如,在学生宿舍管理系统中,显示学生的退宿倒计时可以帮助管理人员有效监控即将到期的宿舍安排,并及时进行必要的调整。这样的功能不仅提高了管理效率,也增加…

H5接入企微JS-SDK,使用wx.previewFile进行文件预览

最近上项目,需求是做一个附件预览并且可以进行保存到手机、用其他应用打开的需求的需求,用企微的JS-SDK的wx.previewFile就可以满足以上的需求了 详细的可以参考:企业微信官方文档 前端 1、在项目的index.html中添加:jweixin-1.2…

两种用MATLAB绘制色块的方法

绘制色块首先可以想到用填充像素的方式 % 定义图像的尺寸 imageSize 500;% 创建一个 imageSize x imageSize x 3 的矩阵,每个像素都是绿色 % RGB颜色模型中绿色的值为 [0, 1, 0] greenImage zeros(imageSize, imageSize, 3); greenImage(:, :, 2) ones(imageSiz…

Kubeadm快速安装 Kubernetes集群

Kubernetes的基础概念 Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。Kubernetes 提供了强大的抽象能力,使得开发者能够专注于应用程序的逻辑,而无需担心底层容器的…

某框架路由渗透

前言 某天在互联网平台上看待DWR路由的文章,然后去搜索了一下相关的信息,发现该DWR路由技术挺久远的,因此就简单的学习了一下该路由,然后发现该DWR路由也可能存在漏洞点,因此找了某站进行测试看看是否有无啥收获&…

学习笔记 韩顺平 零基础30天学会Java(2024.8.15)

P512 ArrayList底层源码2 P513 Vector注意事项 最近有点懈怠,要去新的环境上学了,有点焦虑,调整状态ing,准备开始研一,希望能继续本科的荣耀!! PS:本科应该算是荣耀的吧哈哈哈哈哈