小谈设计模式(18)—适配器模式

news2024/11/20 20:26:56

小谈设计模式(18)—适配器模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 适配器模式
    • 角色分析
      • 目标接口(Target)
      • 源接口(Adaptee)
      • 适配器(Adapter)
    • 核心思想
    • 应用场景
    • Java程序实现
      • 输出结果
      • 程序分析
        • 1
        • 2
        • 3
    • 优缺点分析
      • 优点
        • 1
        • 2
        • 3
      • 缺点
        • 1
        • 2
    • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

适配器模式

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
在这里插入图片描述

角色分析

目标接口(Target)

客户端期望的接口,适配器将原始接口转换成目标接口。

源接口(Adaptee)

需要被适配的类或接口。

适配器(Adapter)

实现目标接口,同时持有源接口的实例,将目标接口的方法调用转发给源接口的实例。

核心思想

通过适配器将目标接口的方法调用转发给源接口的实例。这样一来,客户端就可以通过目标接口来使用源接口的功能。

在这里插入图片描述

应用场景

当需要使用一个已经存在的类,但其接口不符合需求时,可以使用适配器模式。例如,使用第三方库提供的接口,但需要将其转换成自己系统中的接口。
当需要复用一些已经存在的类,但是接口与系统的其他部分不兼容时,可以使用适配器模式。例如,将不同数据库的操作接口统一成一个接口。
在这里插入图片描述

Java程序实现

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

// 源接口
class Adaptee {
    void specificRequest() {
        System.out.println("Adaptee: specificRequest");
    }
}

// 适配器
class Adapter implements Target {
    private Adaptee adaptee;

    Adapter(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 Adapter(adaptee);
        target.request();
    }
}

在这里插入图片描述

输出结果

Adaptee: specificRequest

这说明适配器模式成功地将不兼容的接口转换成了兼容的接口,使得客户端可以使用目标接口来调用源接口的功能。

程序分析

1

在上面的示例中,我们有一个目标接口Target,其中定义了客户端所期望的方法request。我们还有一个源接口Adaptee,其中有一个不兼容的方法specificRequest。

2

为了使得客户端可以使用Target接口来调用specificRequest方法,我们创建了一个适配器Adapter,实现了Target接口,并持有一个Adaptee的实例。在适配器的request方法中,我们将Target接口的方法调用转发给Adaptee的specificRequest方法。

3

在客户端代码中,我们创建了一个Adaptee实例和一个适配器Adapter实例,并将Adaptee实例传递给适配器的构造函数。然后,我们使用Target接口来调用request方法,实际上是调用了Adaptee的specificRequest方法。
在这里插入图片描述

优缺点分析

优点

1

适配器模式可以让不兼容的接口协同工作。

2

适配器模式可以复用已有的类,而无需修改其源代码。

3

适配器模式可以将不同接口的类组合在一起工作。

缺点

1

适配器模式增加了系统的复杂性,因为需要增加一个适配器类。

2

适配器模式可能会降低系统的性能,因为需要进行额外的转换操作。
在这里插入图片描述

总结

适配器模式可以将不兼容的接口转换成兼容的接口,使得原本无法一起工作的类可以协同工作。它是一种非常常用的设计模式,可以提高系统的灵活性和可扩展性。

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

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

相关文章

【Python】基于OpenCV人脸追踪、手势识别控制的求生之路FPS游戏操作

【Python】基于OpenCV人脸追踪、手势识别控制的求生之路FPS游戏操作 文章目录 手势识别人脸追踪键盘控制整体代码附录:列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 视频: 基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 手…

两文学会scala (下)|保姆级别教程(超详细)

上文内容概括: Scala 概述与安装、变量、运算符、流程控制、函数式编程、面向对象 上文链接:两文学会scala (上)|保姆级别教程(超详细)_超爱慢的博客-CSDN博客 目录 第7章 集合 7.1 集合简介…

增强负样本提高CPI表现

确定CPI对药物发现至关重要。由于实验验证CPI通常是耗时和昂贵的,计算方法有望促进这一过程。可用CPI数据库的快速增长加速了许多用于CPI预测的机器学习方法发展。然而,它们的性能,特别是它们对外部数据的泛化性,经常受到数据不平…

根据您的数据量定制的ChatGPT,改变客户服务的方式

在当今竞争激烈的商业环境中,提供优质的客户服务对于保持忠诚的客户群和推动业务增长至关重要。客户满意度已成为各行各企业的首要任务,因为它直接影响客户留存和品牌声誉。随着技术的进步,公司不断探索创新解决方案,以增强客户服…

Mac 挂载 Alist网盘

挂载服务器的Alist 网盘到 Mac mac,使用的是 CloundMounter 这个软件进行挂载 http://ip:port/dav/ 需要在末尾加上 /dav/ 在一些服务器上,为了提供WebDAV服务,需要在URL地址的末尾添加"/dav/“。这是因为WebDAV协议规定了一些标准的URL路径&#x…

1024 科学计数法

一.问题: 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [-][1-9].[0-9]E[-][0-9],即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确…

SpringBoot的流浪宠物系统

采用技术:springbootvue 项目可以完美运行

数控车床中滚珠螺母的维护保养方法

滚珠螺母是一种高精度的机械部件,广泛应用于各种机械设备中,包括数控机床、精密轴承座、滚珠丝杆等,滚珠螺母作为数控机床中的进给系统的重要组件,其维护保养方法对于机床的精度和使用寿命具有重要影响。以下为数控机床滚珠螺母维…

1800_vim的宏录制功能尝试

全部学习信息汇总: GreyZhang/editors_skills: Summary for some common editor skills I used. (github.com) 最近5年多来,我emacs的编辑器用的还是比较多的。我的配置基本上是一个spacemacs,然后根据自己的需求增加了一丁点儿的其他配置。而…

数据结构基本概念-Java常用算法

数据结构基本概念-Java常用算法 1、数据结构基本概念2、数据逻辑结构3、算法时间复杂度 1、数据结构基本概念 数据(Data):数据是信息的载体,其能够被计算机识别、存储和加工处理,是计算机程序加工的“原材料”。数据元…

C++stackqueue

目录 一、stack 1.1 简要介绍 1.2 小试身手 1.3 模拟实现 二、queue 2.1 简要介绍 2.2 小试身手 2.3 模拟实现 三、deque 3.1 简要介绍 3.2 分析底层 四、priority_queue 4.1 简要介绍 4.2 小试身手 4.3 模拟实现 五、仿函数/函数对象 5.1 简要介绍 一…

全网最全Python系列教程(非常详细)---Python中文乱码讲解(学Python入门必收藏)

🧡🧡🧡这篇是关于Python中为什么会出现中文乱码的讲解,欢迎点赞和收藏,你点赞和收藏是我更新的动力🧡🧡🧡 在解释Python中中文乱码的问题之前,我们先对计算机中几个基本…

物联网AI MicroPython传感器学习 之 手指侦测心跳传感器

学物联网,来万物简单IoT物联网!! 一、产品简介 手指侦测心跳传感器是通过LED和光电晶体管监测手指血压脉冲,来判断人的心脏跳动。其结构简单成本低廉,只能是做一些实验和学习相关的知识(没有医疗实用价值&…

C++11新特性(语法糖,新容器)

距离C11版本发布已经过去那么多年了,为什么还称为新特性呢?因为笔者前面探讨的内容,除了auto,范围for这些常用的,基本上是用着C98的内容,虽说C11已经发布很多年,却是目前被使用最广泛的版本。因…

string类的模拟实现(万字讲解超详细)

目录 前言 1.命名空间的使用 2.string的成员变量 3.构造函数 4.析构函数 5.拷贝构造 5.1 swap交换函数的实现 6.赋值运算符重载 7.迭代器部分 8.数据容量控制 8.1 size和capacity 8.2 empty 9.数据修改部分 9.1 push_back 9.2 append添加字符串 9.3 运算符重载…

Nacos与Eureka的区别

大家好我是苏麟今天说一说Nacos与Eureka的区别. Nacos Nacos的服务实例分为两种l类型: 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。非临时实例:如果实例宕机,不会从服务列表剔除&…

Python安装指南:安装Python、配置Python环境(附安装包)

1. 选择正确的版本,下载安装包 根据你的实际需要选择Python发行版本。 值得注意的是,编程语言包并不是越新越好的,不同版本的Python之间可能会产生兼容性问题。 如果你不确定你的项目需要哪个版本,请查阅您可能需要使用到的插件的…

输入电压转化为电流性 5~20mA方案

输入电压转化为电流性 5~20mA方案 方案一方案二方案三 方案一 XTR111是一款精密的电压-电流转换器是最广泛应用之一。原因有二:一是线性度非常好、二是价格便宜。总结成一点,就是性价比高。 典型电路 最终电路 Z1二极管处输出电流表达式:…

(c语言进阶)数据存储——浮点型存储

一.常见的浮点数 二.浮点数存储规则 1.float存储规定 2.double存储规定 3.M的存储规则 4.E的存储规则 5.指数E从内存中取出的三种情况 (1)E不全为0或不全为1 (2)E全为0 (3)E全为1 三.举例 1.经典…

【高级rabbitmq】

文章目录 1. 消息丢失问题1.1 发送者消息丢失1.2 MQ消息丢失1.3 消费者消息丢失1.3.1 消费失败重试机制 总结 2. 死信交换机2.1 TTL 3. 惰性队列3.1 总结: 4. MQ集群 消息队列在使用过程中,面临着很多实际问题需要思考: 1. 消息丢失问题 1.1…