设计模式之 适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。通过使用适配器模式,原本由于接口不兼容的类可以进行协作。简单来说,适配器模式就是将不兼容的接口连接起来,使得客户端能够与之交互而不需要修改原有代码。

在现实世界中,这就像是一个电压适配器,它将不同电压的插头转化为标准插座的电压和插头,以便设备能够正常使用。

一、适配器模式的结构

适配器模式的结构通常由以下几个部分组成:

  • Target(目标接口): 客户端依赖的接口。
  • Adapter(适配器): 通过继承或组合将 Adaptee 转换为 Target,使得客户端可以通过目标接口与适配者交互。
  • Adaptee(适配者): 需要适配的类,它的接口不能直接与客户端的接口兼容。

二、适配器模式的分类

适配器模式有两种常见的实现方式:

  1. 类适配器模式(Class Adapter Pattern):

    • 使用继承来实现适配。
    • 适配器类继承自适配者类,并实现目标接口。
    • 这种方式利用了类的继承关系,将适配者类的接口转换为目标接口。
  2. 对象适配器模式(Object Adapter Pattern):

    • 使用组合来实现适配。
    • 适配器类包含一个适配者对象,并通过该对象将适配者的接口转换为目标接口。
    • 这种方式通过对象组合的方式解决适配问题,相比类适配器模式,它更加灵活且避免了多重继承带来的复杂性。

三、适配器模式的示例

现有一台电脑只能读取SD卡,而要读取TF卡中的内容的话就需要使用到适配器模式。创建一个读卡器,将TF卡中的内容读取出来。

1. 示例一:类适配器模式
  • SD卡接口
    public interface SDCard {public void readSD();
    }
    
  • SD卡实现类
    public class SDCardImpl implements SDCard {@Overridepublic void readSD() {System.out.println("正在读取SD卡信息");}
    }
  • 读卡器
    public class TFAdaptCD extends TFCardImpl implements SDCard {@Overridepublic void readSD() {System.out.println("正在通过适配器读取");readTFCard();}
    }
  • TF卡接口
    public interface TFCard {public void readTFCard();
    }
    
  • TF卡实现类
    public class TFCardImpl implements TFCard {@Overridepublic void readTFCard() {System.out.println("正在读取TF卡信息");}
    }
    
  • 电脑类
    public class Computer {public void readSD(SDCard cdCard){cdCard.readSD();}
    }
    
  • 测试类
    public class Client {public static void main(String[] args) {Computer computer = new Computer();computer.readSD(new SDCardImpl());computer.readSD(new TFAdaptCD());}
    }
  • 结果
2. 示例二:对象适配器模式

只需要更改适配器类

public class TFAdaptCD implements SDCard {TFCard tfCard = new TFCardImpl();@Overridepublic void readSD() {System.out.println("正在通过适配器读取");tfCard.readTFCard();}
}

客户端类

public class Client {public static void main(String[] args) {Computer computer = new Computer();computer.readSD(new SDCardImpl());computer.readSD(new TFAdaptCD(new TFCardImpl()));}
}

四、适配器模式的应用场景

适配器模式的使用场景通常包括以下几种情况:

  1. 需要使用一个已有的类,但它的接口和客户端需要的接口不兼容。

    当你想要复用一个已经存在的类,但它的接口与当前系统的接口不兼容时,适配器模式是一个有效的解决方案。
  2. 希望通过一个新接口来替代原本的接口,而不修改现有代码。

    适配器模式允许你在不改变原有代码的情况下,将现有的接口转化为你期望的接口。
  3. 希望让某个类与其他类协同工作,而它们的接口不兼容。

    适配器模式为不同的类提供了一个桥梁,使得它们能够协同工作。
  4. 希望对某个类的接口进行改造,但不想修改原类的实现。

    在这种情况下,适配器模式通过封装原有类的功能,提供一个新的接口,避免修改原始类的代码。
  5. 第三方库的接口不符合需求时。

    当你使用第三方库时,它的接口可能无法满足当前系统的需求。适配器模式可以帮助你对这些接口进行适配,使它们能够与现有系统兼容。

五、适配器模式的优缺点

优点:
  1. 解耦合: 客户端与适配者之间通过适配器进行交互,客户端不需要知道适配者的实现细节。客户端依赖于目标接口,而不是适配者的实现,增强了系统的灵活性。
  2. 复用性: 通过适配器模式,可以将多个不兼容的接口组合在一起进行复用,使系统具备更高的可复用性。
  3. 灵活性: 如果需要改变适配的类,适配器模式允许你不修改客户端代码,只需要更换适配器即可。
  4. 增强了系统的扩展性: 适配器模式可以帮助系统扩展新的功能,而不会影响现有的接口或系统。
缺点:
  1. 增加了额外的类: 适配器模式引入了额外的适配器类,这可能会使得系统的复杂性增加,尤其是当使用适配器类的数量较多时。
  2. 性能开销: 适配器类通常会做一些额外的转换工作,因此可能会带来一些性能开销,尤其是在高频次的调用场景中。
  3. 难以管理复杂的适配器: 当系统中需要适配的接口较多时,适配器的数量会增加,这可能会导致管理上的困难。

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

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

相关文章

【LLM训练系列02】如何找到一个大模型Lora的target_modules

方法1:观察attention中的线性层 import numpy as np import pandas as pd from peft import PeftModel import torch import torch.nn.functional as F from torch import Tensor from transformers import AutoTokenizer, AutoModel, BitsAndBytesConfig from typ…

萨瑞MCU R7FA8D1BH环境搭建教程

萨瑞MCU R7FA8D1BH环境搭建教程 如果你是大学生 遇到电子技术 学习 成长 入行难题 佳喔威信,给你提供一定资源和战略方法上的帮助 相信我的专业职业经历一定能帮到你 目录 概述 2. 开发板介绍3. 搭建rtthread环境4. 安装瑞萨的keil环境5. 搭建瑞萨的keil辅助环境…

鸿蒙实战:使用显式Want启动Ability

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙应用项目2.2 修改Index.ets代码2.3 创建SecondAbility2.4 创建Second.ets 3. 测试效果4. 实战总结5. 拓展练习 - 启动文件管理器5.1 创建鸿蒙应用项目5.2 修改Index.ets代码5.3 测试应用运行效果 1. 实战概述 本实战详细阐述了在 …

PH热榜 | 2024-11-19

DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 在线预览 1. Layer 标语:受大脑启发的规划器 介绍:体验一下这款新一代的任务和项目管理系统吧!它…

React Native 基础

React 的核心概念 定义函数式组件 import组件 要定义一个Cat组件,第一步要使用 import 语句来引入React以及React Native的 Text 组件: import React from react; import { Text } from react-native; 定义函数作为组件 const CatApp = () => {}; 渲染Text组件

Jenkins更换主题颜色+登录页面LOGO图片

默认主题和logo图片展示 默认主题黑色和白色。 默认LOGO图片 安装插件 Login ThemeMaterial Theme 系统管理–>插件管理–>Available plugins 搜不到Login Theme是因为我提前装好了 没有外网的可以参考这篇离线安装插件 验证插件并修改主题颜色 系统管理–>A…

LLM文档对话 —— pdf解析关键问题

一、为什么需要进行pdf解析? 最近在探索ChatPDF和ChatDoc等方案的思路,也就是用LLM实现文档助手。在此记录一些难题和解决方案,首先讲解主要思想,其次以问题回答的形式展开。 二、为什么需要对pdf进行解析? 当利用L…

JAVA:探索 PDF 文字提取的技术指南

1、简述 随着信息化的发展,PDF 文档成为了信息传播的重要媒介。在许多应用场景下,如数据迁移、内容分析和信息检索,我们需要从 PDF 文件中提取文字内容。JAVA提供了多种库来处理 PDF 文件,其中 PDFBox 和 iText 是最常用的两个。…

【priority_queue的使用及模拟实现】—— 我与C++的不解之缘(十六)

前言 ​ priority_queue,翻译过来就是优先级队列,但是它其实是我们的堆结构(如果堆一些遗忘的可以看一下前面的文章复习一下【数据结构】二叉树——顺序结构——堆及其实现_二叉树顺序结构-CSDN博客),本篇文章就来使用…

MacOS下的Opencv3.4.16的编译

前言 MacOS下编译opencv还是有点麻烦的。 1、Opencv3.4.16的下载 注意,我们使用的是Mac,所以ios pack并不能使用。 如何嫌官网上下载比较慢的话,可以考虑在csdn网站上下载,应该也是可以找到的。 2、cmake的下载 官网的链接&…

Kibana 本地安装使用

一 Kibana简介 1.1 Kibana 是一种数据可视化工具,通常需要结合Elasticsearch使用: Elasticsearch 是一个实时分布式搜索和分析引擎。 Logstash 为用户提供数据采集、转换、优化和输出的能力。 Kibana 是一种数据可视化工具,为 Elasticsear…

基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)

#1024程序员节|征文# 博主介绍:CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老…

【Android、IOS、Flutter、鸿蒙、ReactNative 】实现 MVP 架构

Android Studio 版本 Android Java MVP 模式 参考 模型层 model public class User {private String email;private String password;public User(String email, String password) {this.email = email;this.password = password;}public String getEmail() {return email;}…

android 使用MediaPlayer实现音乐播放--获取音乐数据

前面已经添加了权限&#xff0c;有权限后可以去数据库读取音乐文件&#xff0c;一般可以获取全部音乐、专辑、歌手、流派等。 1. 获取全部音乐数据 class MusicHelper {companion object {SuppressLint("Range")fun getMusic(context: Context): MutableList<Mu…

Android kotlin之配置kapt编译器插件

配置项目目录下的gradle/libs.versions.toml文件&#xff0c;添加kapt配置项&#xff1a; 在模块目录下build.gradle.kt中增加 plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)// 增加该行alias(libs.plugins.jetbrains.kotl…

HarmonyOs DevEco Studio小技巧31--卡片的生命周期与卡片的开发

Form Kit简介 Form Kit&#xff08;卡片开发服务&#xff09;提供一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到服务卡片&#xff08;以下简称“卡片”&#xff09;&#xff0c;以达到服务直达、减少跳转层级的体验效果。卡片常用于嵌入到其他应用&#xff0…

【GeekBand】C++设计模式笔记11_Builder_构建器

1. “对象创建” 模式 通过 “对象创建” 模式绕开new&#xff0c;来避免对象创建&#xff08;new&#xff09;过程中所导致的紧耦合&#xff08;依赖具体类&#xff09;&#xff0c;从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式 Factory MethodAbstract …

Ubuntu问题 - 显示ubuntu服务器上可用磁盘空间 一条命令df -h

目的 想要放我的 数据集 到新的ubuntu服务器中, 不知道存储空间够不够 开始 使用以下命令直接查看 df -h

.NET 9与C# 13革新:新数据类型与语法糖深度解析

记录&#xff08;Record&#xff09;类型 使用方式&#xff1a; public record Person(string FirstName, string LastName); 适用场景&#xff1a;当需要创建不可变的数据结构&#xff0c;且希望自动生成 GetHashCode 和 Equals 方法时。不适用场景&#xff1a;当数据结构需…

学习笔记030——若依框架中定时任务的使用

定时任务是软件开发中经常使用一个功能。 Java定时任务广泛应用于各种需要定时执行或周期性执行任务的场景&#xff0c;如&#xff1a; 数据备份&#xff1a;定期备份数据库中的数据&#xff0c;确保数据的安全性和可靠性。数据同步&#xff1a;如果有多个数据源需要同步数据…