【软考】设计模式之适配器模式

news2024/11/15 11:54:21

目录

          • 1. 说明
          • 2. 应用场景
          • 3. 结构图
          • 4. 构成
          • 5. 优缺点
            • 5.1 优点
            • 5.2 缺点
          • 6. 适用性
          • 7. java示例
            • 7.1 类适配器模式
            • 7.2 对象适配器模式

1. 说明
  • 1.Adapter(适配器)。
  • 2.将一个类的接口转换成客户希望的另外一个接口。
  • 3.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
  • 4.类适配器使用多重继承对一个接口与另一个接口进行匹配。
  • 5.对象适配器依赖于对象组合。
  • 6.适配器模式是一种非常实用的设计模式,它能够帮助我们解决接口不兼容的问题,提高系统的灵活性和可扩展性。
2. 应用场景
  • 1.旧接口适配新接口:当系统中的一个类需要使用另一个类的接口,但这两个类的接口不兼容时,可以使用适配器模式。
  • 2.多个类的接口统一:当系统中的多个类的接口不统一时,可以使用适配器模式将它们的接口统一成一个接口,从而提高系统的灵活性和可扩展性。
  • 3.封装有缺陷的接口设计:如果某个类的接口设计存在缺陷或不符合标准规范,可以使用适配器模式进行封装,使其更符合客户端的使用习惯或需求。
3. 结构图
  • 1.类适配器结构图
    在这里插入图片描述
  • 2.对象适配器结构图
    在这里插入图片描述
4. 构成
  • 1.目标接口(Target Interface):定义客户端所期望使用的与特定领域相关的接口方法。
  • 2.适配器(Adapter):适配器类实现目标接口,并持有一个适配者对象。适配器通过调用适配者对象的方法,将其转换为目标接口方法。适配器可以是类适配器(通过继承实现)或对象适配器(通过组合实现)。
  • 3.适配者(Adaptee):已经存在的类或接口,提供了特定的功能,但与目标接口不兼容,这个接口需要适配。
  • 4.客户端(Client):使用目标接口进行操作的类或对象。
5. 优缺点
5.1 优点
  • 1.提高兼容性:能够解决接口不兼容的问题,使得原本不兼容的类能够协同工作。
  • 2.灵活性:通过使用适配器,客户端代码可以独立于不兼容的接口进行编写,从而提高了系统的灵活性。当需要更换或修改被适配的类时,只需要修改适配器即可,而不需要修改客户端代码。
  • 3.扩展性:适配器模式可以轻松地添加新的适配器来支持新的接口,这使得系统更易于扩展。
  • 4.复用性:适配器可以复用现有的功能,通过转换接口来适应新的环境或需求,提高了代码的复用性。
5.2 缺点
  • 1.增加复杂性:引入适配器模式可能会增加系统的复杂性,因为需要编写额外的适配器代码。这可能会使得系统的理解和维护变得更加困难。
  • 2.性能损耗:适配器模式在转换接口的过程中可能会引入一些性能损耗,尤其是在处理大量数据时。这是因为适配器需要在客户端和被适配类之间进行额外的转换操作。
  • 3.可能产生过多的适配器:如果系统中存在大量的不兼容接口,那么可能需要编写大量的适配器来解决这些问题。这可能会导致系统中存在过多的适配器类,使得系统结构变得复杂。
6. 适用性
  • 1.想使用一个已经存在的类,而它的接口不符合要求。
  • 2.想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
  • 3.(仅适用于对象 Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
7. java示例
7.1 类适配器模式
  • 1.老打印机类
package com.learning.adapter.class_adapter;

/**
 * 旧打印机类,有老旧的打印方法
 */
public class OldPrinter {
    public void printOld(String content){
        System.out.println("旧打印机打印内容:" + content);
    }
}

  • 2.打印接口
package com.learning.adapter.class_adapter;
/**
 * 打印接口
 */
public interface Printable {
    void print(String content);
}
  • 3.新系统
package com.learning.adapter.class_adapter;

/**
 * 新系统
 */
public class NewSystem {
    private Printable printer;

    public NewSystem(Printable printer){
        this.printer = printer;
    }
    public void printDocument(String content){
        printer.print(content);
    }
}
  • 4.旧打印机适配器类
package com.learning.adapter.class_adapter;

/**
 * 旧打印机适配器类
 */
public class OldPrinterAdapter extends OldPrinter implements Printable{
    @Override
    public void print(String content){
        // 调用旧打印机的打印方法
        printOld(content);
    }
}
  • 5.客户端类
package com.learning.adapter.class_adapter;

/**
 * 客户端类
 */
public class Client {
    public static void main(String[] args) {
        NewSystem newSystem = new NewSystem(new OldPrinterAdapter());
        newSystem.printDocument("Hello World!");
    }
}
  • 6.示例截图
    在这里插入图片描述
7.2 对象适配器模式
  • 1.旧打印机适配器类
package com.learning.adapter.object_adapter;

/**
 * 旧打印机适配器类
 */
public class OldPrinterAdapter implements Printable {

    private OldPrinter oldPrinter;

    public OldPrinterAdapter(OldPrinter oldPrinter){
        this.oldPrinter = oldPrinter;
    }
    @Override
    public void print(String content){
        // 调用旧打印机的打印方法
        oldPrinter.printOld(content);
    }
}
  • 2.客户端类
package com.learning.adapter.object_adapter;

/**
 * 客户端类
 */
public class Client {
    public static void main(String[] args) {
        NewSystem newSystem = new NewSystem(new OldPrinterAdapter(new OldPrinter()));
        newSystem.printDocument("Hello World!");
    }
}

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

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

相关文章

visionTransformer window平台下报错

错误: KeyError: Transformer/encoderblock_0/MlpBlock_3/Dense_0kernel is not a file in the archive解决方法: 修改这个函数即可,主要原因是Linux系统与window系统路径分隔符不一样导致 def load_from(self, weights, n_block):ROOT f&…

物理隔离条件下的数据安全导入导出方案,哪种最安全可控?

数据安全在当今信息化社会中扮演着至关重要的角色,尤其像政府、军工等单位,有比较多的核心数据要保护,一旦出现数据泄漏,将造成不可估量的后果。因此为了保护数据安全,政府、军工等单位一般会采取纯物理隔离&#xff0…

day07 51单片机-串口通信

51 单片机-串口通信 1 串口通信 1.1 需求描述 本案例讲解如何通过串口和PC以9600波特率,无校验位、1停止位通信。最终实现PC向单片机发送字符串,单片机回复PC。本案例中采用串口1通信。 1.2 硬件设计 1.2.1 串口工作原理 串口是将数据按照比特逐一发送的通信接口。在串…

视频教程下载:ChatGPT驱动的SEO、网络营销、生产力提升

用户遇到的一个常见问题是在ChatGPT对话过程中难以保持清晰的目的和专注。这可能导致互动无效和浪费时间。这门课程将教给各种创意人士——艺术家、制造者、博主、讲师和内容创作者——如何制定理想的提示配方,从而产生更有成效的对话和更高的回报。 这是一门关于如…

《R语言与农业数据统计分析及建模》学习——数据框的向量化操作

1、向量化操作的概念和有时 向量化操作是指对整个数据结构进行一次性操作,而不需要使用显式的循环结构(即同时处理整个数据框的元素,而不需要使用for循环逐个处理每个元素)。优势如下: 代码简洁:不需要编写…

3.Docker常用镜像命令和容器命令详解

文章目录 1、Docker镜像命令1.1 获取镜像1.2 查看镜像1.2.1、images命令列出镜像1.2.2、tag命令添加镜像标签1.2.3、inspect命令查看详细信息1.2.4、history命令查看镜像历史 1.3 搜索镜像1.4 删除和清理镜像1.4.1、使用标签删除镜像1.4.2、清理镜像 1.5 创建镜像1.5.1、基于已…

node.js如何实现留言板功能?

一、实现效果如下: 20240422_160404 二、前提配置: 配置:需要安装并且导入underscore模板引擎 安装:在控制台输入npm install underscore -save 文件目录配置: 1》在文件里建一个data文件夹,此文件夹下…

SLS 查询新范式:使用 SPL 对日志进行交互式探索

作者:无哲 引言 在构建现代数据和业务系统的过程中,可观测性已经变得至关重要,日志服务(SLS)为 Log/Trace/Metric 数据提供了大规模、低成本、高性能的一站式平台服务,并提供数据采集、加工、投递、分析、…

【PhpStorm的环境配置与应用的简单介绍】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

AWD线下攻防万字最完整战术(记第一届“长城杯”半决赛战术)

目录 准备阶段 1.登录比赛平台(获取资产) 查看账号账号修改 服务器SSH口令mysqlWEB服务口令(后台密码)数据库后台管理员密码 账号用户检查 2.dump源码(方便应急响应恢复靶机) 网站源码备份 压缩文件解压文件备份到服务器本地上传…

探索大型语言模型(LLM)在人类性格个性评估(MBTI)中的前景与应用

1.概述 大型语言模型(LLM)如ChatGPT在各个领域的应用确实越来越广泛,它们利用庞大的数据集进行训练,以模拟人类的语言理解和生成能力。这些模型在提供信息、解答问题、辅助决策等方面表现出了强大的能力,但它们并不具…

Docker pull镜像名称 把本地镜像推送到远程详解

Docker pull镜像名称 把本地镜像推送到远程详解: Docker 镜像 仓库 容器介绍 以及镜像仓库详解 下载一个alpine的镜像演示,alpine是一个比较小的的linux镜像。 docker pull alpinedocker tag d4ff818577bc docker.io/itying/alpine:v1.0.1docker tag d4…

Macs Fan Control Pro for Mac:全面优化Mac风扇控制软件

Macs Fan Control Pro for Mac是一款专为苹果电脑用户设计的风扇控制软件,旨在通过精确的风扇速度调节,全面优化Mac的散热性能,确保系统始终运行在最佳状态。 Macs Fan Control Pro for Mac中文版下载 该软件具备实时监控功能,能够…

ESP32与SD卡交互实现:文件读写实战与初始化详解及引脚定义

本代码实现ESP32与SD卡的交互,包括定义SPI引脚、创建自定义SPI类实例、编写WriteFile与ReadFile函数进行文件读写。setup函数初始化串口、SPI、SD卡,向“/test.txt”写入“myfirstmessage”,读取并打印其内容。loop函数留空待扩展。 1. 需要…

区块链安全应用-------压力测试

基于已有的链进行测试(build_chain默认建的链 四个节 点): 第一步:搭链 1. 安装依赖 在ubuntu操作系统中,操作步骤如下: sudo apt install -y openssl curl 2. 创建操作目录, 下载安装脚本 ## 创建操作…

HDFS分布式文件存储系统

1-1 HDFS的存储机制 按块(block)存储 hdfs在对文件数据进行存储时,默认是按照128M(包含)大小进行文件数据拆分,将不同拆分的块数据存储在不同datanode服务器上 拆分后的块数据会被分别存储在不同的服务器上 副本机制 为了保证hdfs…

标题Selenium IDE 常见错误笔记

Selenium IDE 常见错误笔记 错误1:Failed:Exceeded waiting time for new window to appear 2000ms 这个错误通常出现在第一次运行时,有两个原因: Firefox阻止了弹出式窗口,在浏览器设置里允许这个操作即可。 有些网站设置了反…

轻松上手,无缝对接:详述如何接入企讯通空号检测接口API

企讯通空号检测接口API作为一款高效、精准的手机号码状态检测工具,能够帮助企业及开发者快速识别手机号码的有效性,优化通讯资源,提升营销效果。本篇文章将带领您一步步了解如何轻松、无缝地对接企讯通空号检测接口API,让您的业务…

HIVE无法启动问题

​ 启动不了hive 一直在加载中! 问题:当我们打开电脑 想要学习hive时 我们却发现 它一直卡在启动页面 true一直后没有信息或者报错 原因:我们在之前学习时 在配置hdfs的高可用时(High Availability 简称HA) 高可用…

stm32HAL_GPIO输入

学会使用 GPIO 采集 KEY 的数据信息,这种信息采集技术在生活中常见于对大自 然环境的各种信息的采集。比如环境温度,湿度等等。我们这里以 key 为入门设 备。 一,什么是信息采集 比如环境温度,湿度等等。我们需要把这些温度&am…