设计模式- 适配器模式(Adapter Pattern)结构|原理|优缺点|场景|示例

 目录

        设计模式(分类)        设计模式(六大原则)   

    创建型

        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

     结构型

        适配器模式


适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个接口转换为客户期望的另一个接口,从而使原本不兼容的类能够协同工作。适配器模式的主要目的是解决接口不匹配的问题,它通过创建一个适配器类,将源接口转换为目标接口,使得原本无法直接交互的类能够通过适配器进行通信。

模式结构

适配器模式通常包含以下角色:

  1. 目标接口(Target):定义客户端期望的接口,可以是一个接口或抽象类。目标接口是客户程序需要使用的接口。

  2. 源接口(Adaptee):需要被适配的接口,通常是第三方提供的接口或者遗留系统中的接口。

  3. 适配器(Adapter):适配器类实现了目标接口,并持有源接口的一个实例。适配器类通过将源接口的方法映射到目标接口的方法,使得客户端可以像使用目标接口一样使用源接口。

工作原理

  • 客户端:调用适配器对象的目标接口方法,与源接口无关。
  • 适配器:实现目标接口,内部持有源接口对象的引用。适配器在实现目标接口方法时,调用源接口对象的相关方法,将源接口的接口转换为客户端期望的目标接口。

适配器模式的两种形式

  1. 类适配器:适配器类通过继承源接口(Adaptee)并实现目标接口(Target)来实现适配。这种方式要求源接口必须是具体类,且目标接口和源接口之间要有一定的继承关系或共同父类。

  2. 对象适配器:适配器类通过组合(持有源接口对象的引用)而非继承来实现适配。适配器类实现目标接口,并在其方法中调用源接口对象的方法。这种方式更灵活,不要求源接口必须是具体类,也不要求源接口与目标接口之间有继承关系。

优缺点

优点
  • 复用现存类:适配器模式允许在不修改现有代码的情况下,将一个类的接口转换为另一个接口,使得现有类可以被复用。
  • 兼容性:通过适配器模式,可以使原本不兼容的接口之间能够协同工作,提高了系统的兼容性。
  • 灵活性:对象适配器模式可以将一个接口转换成多个接口,而类适配器模式由于Java的单继承限制,只能一对一地适配。
缺点
  • 过多的适配器:如果系统中存在大量的适配器类,可能会增加系统的复杂性,不易管理。
  • 过多的类:在使用类适配器时,可能会增加类的数量,特别是当系统中存在大量需要适配的类时。

适用场景

  • 需要使用一个已经存在的类,但它的接口不符合需求:可以通过适配器模式创建一个适配器类,将已有类的接口转换为期望的接口。
  • 想要创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作:适配器模式可以将目标接口与源接口解耦,使得适配器类可以适应更多的源接口。
  • 需要使用几个具有类似功能但接口不兼容的类:通过适配器模式可以创建统一的接口,简化客户端代码。

代码示例(以Java为例,展示对象适配器)

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

// 源接口(被适配的接口)
public class Adaptee {
    public void specificRequest() {
        System.out.println("Adaptee-specific request");
    }
}

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

    public 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-specific request
    }
}

在这个Java示例中:

  • Target接口代表客户端期望的接口。
  • Adaptee类是需要被适配的源接口。
  • Adapter类实现了Target接口,并持有一个Adaptee对象的引用。在request()方法中,调用了adaptee.specificRequest(),实现了接口的适配。
  • 客户端代码创建Adaptee对象,然后通过Adapter将其包装成Target接口,并调用request()方法,实现了源接口与目标接口之间的转换。

 代码示例(以Python为例)

# 目标接口
class Target:
    def request(self):
        raise NotImplementedError("Subclasses must implement this method")

# 源接口(被适配的接口)
class Adaptee:
    def specific_request(self):
        print("Adaptee-specific request")

# 适配器类
class Adapter(Target):
    def __init__(self, adaptee: Adaptee):
        self._adaptee = adaptee

    def request(self):
        self._adaptee.specific_request()

# 客户端代码
def main():
    adaptee = Adaptee()
    adapter = Adapter(adaptee)
    adapter.request()  # 输出:Adaptee-specific request

if __name__ == "__main__":
    main()

在这个Python示例中:

  • Target类作为目标接口,定义了request()方法,要求子类必须实现。
  • Adaptee类是需要被适配的源接口,提供了specific_request()方法。
  • Adapter类继承自Target,实现了request()方法。在该方法中,调用了_adaptee.specific_request(),将源接口的方法映射到目标接口的方法上,实现了接口的适配。
  • 客户端代码创建Adaptee对象,然后通过Adapter将其包装成Target接口,并调用request()方法,实现了源接口与目标接口之间的转换。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能基础】状态空间搜索

状态空间法 状态空间:一个问题全部可能的状态以及其关系的集合。 状态空间图:以图的形式表示问题的状态空间,节点对应状态,边对应状态转移算子,边上的权对应转移所需的代价 问题的解:是从最开始状态到目…

BP使用和弱口令漏洞

目录 一、BP使用 1.BP设置 2.Proxy 3.Reapter 4.Decord 5.Intruder 二、弱口令爆破 1.服务弱口令爆破 2.验证码绕过 一、BP使用 1.BP设置 设置代理的监听端口: 这里设置为本机的9090端口 2.Proxy 浏览器要挂代理,设置为本机的9090端口 打开拦截功能 当浏览…

Youtube DNN

目录 1. 挑战 2. 系统整体结构 3.召回 4. 排序 5. 训练和测试样本的处理 1. 挑战 (1)规模。很多现有的推荐算法在小规模上效果好,但Youtobe规模很大。 (2)新颖度。Youtobe语料库是动态的,每秒都会有…

Windows如何安装JDK

JDK和JRE简介 JDK:Java Development ToolKit java开发工具包,包含JRE针对java程序开发者 JRE:Java Runtime Environment java程序的运行环境针对java使用者来说 下载JDK,进入官网下载 Oracle官网 双击下载好之后的exe文件&#…

关于Python中install edge_tts记录

如下代码: #!/usr/bin/env python3""" Basic audio streaming example.This example shows how to stream the audio data from the TTS engine, and how to get the WordBoundary events from the engine (which could be ignored if not needed).…

分保、等保、关保、密评之间联系与区别

分保、等保、关保、密评之间联系与区别 什么是“三保一评”分保等保关保密评 相关的法律法规依据分保等保关保密评 分保工作简介分保工作流程分级保护技术要求 等保工作简介关保工作简介密评工作简介三保一评联系与区别 什么是“三保一评” 分保 涉密信息系统分级保护 指涉密信…

vivado 存储器校准调试

存储器校准调试 Vivado 中的存储器接口 IP 支持校准调试。其中存储有实用的核配置、校准和数据窗口信息 , 可在 Vivado 硬件管理器 中访问这些信息。“存储器校准调试 (Memory Calibration Debug) ”可随时用于读取此信息 , 并从存储器接口 IP 中获…

Linux命令学习—Iptables 防火墙(上)

1.1、防火墙 1、防火墙的定义 所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上 构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使 Internet 与 Intranet 之间建立起…

LeetCode216:组合总和Ⅲ

题目描述 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 解题思想 使用回溯算法 代码 class So…

代理IP对网络爬虫有什么影响?

代理IP对网络爬虫的影响深远且多方面,主要体现在以下几个方面: 第一点,代理IP能有效防止爬虫IP被封禁:在爬虫工作过程中,如果频繁访问同一目标网站,很容易被该网站的服务器识别为恶意行为,导致…

【大数据】Apache Knox 概述

Apache Knox 概述 1.概述1.1 Kerberos 封装1.2 简化客户端证书的管理1.3 Apache Ranger 集成1.4 Hadoop URLs VS Knox URLs 2.自定义 Apache Knox2.1 Topology2.2 Provider2.3 Services2.4 Personalized services 3.Tips3.1 Setting up SSL3.2 常见问题3.2.1 Bulky answer3.2.2…

【JavaSE】JDK17的一些特性

前言 从springboot3.0开始,已经不⽀持JDK8了 选⽤Java17,概括起来主要有下⾯⼏个主要原因 JDK17是LTS(⻓期⽀持版),可以免费商⽤到2029年。⽽且将前⾯⼏个过渡版(JDK9-JDK16) 去其糟粕,取其精华的版本JDK17…

hbase基础(二)

HBase第二天 名称空间 namespace:名称空间默认hbase有两个名称空间,default、hbasedefault名称空间是默认创建表的位置,hbase是专门存放系统表的名称空间(namespace、meta)管理命名空间指令 create_namespace 命名空…

qt tcp 连接 秒断连,求助

问题: tcp连接总是秒成功后断连 debug会出现下面这些 onecore\net\netprofiles\service\src\nsp\dll\namespaceserviceprovider.cpp(550)\nlansp_c.dll!00007FFDA2A1D93D: (caller: 00007FFDD8BEACF6) LogHr(1) tid(336c) 8007277C ¡£¡£ one…

小型企业网络优化加速方案

随着数字化经济蓬勃发展,小型企业的网络基础设施变得尤为重要。在这一浪潮中,建立一个稳定、高效的企业网络成为支撑业务发展的关键。本文将深入研究针对小型企业设计的网络优化加速方案,助力企业主了解如何规划和实施适合自身业务需求的网络…

Spring Boot 统一功能处理(三)

本篇主要介绍Spring Boot的统一异常处理。 目录 一、统一异常处理的使用 二、测试统一异常处理效果 三、浅析原理 ControllerAdvice简析 统一处理异常简析 一、统一异常处理的使用 在前面介绍统一数据返回时,我们在程序发生异常时会把整个报错信息都封装在da…

BRC20铭文铭刻解析

BRC20铭文铭刻的出现对于智能制造无疑是一个重要的里程碑。随着科技的飞速发展,智能制造已经成为制造业发展的必然趋势!智能制造是指通过运用人工智能、物联网、大数据等先进技术,实现生产过程的自动化、智能化和高效化。 1. BRC20铭文的概念…

Docker了解及命令行使用

一、了解Docker 1、什么是Docker Docker为应用程序的开发、发布和运行提供了一个基于容器的标准化平台。容器运行的是应用程序,Docker平台用来管理容器的整个生命周期 2、虚拟机与容器 2.1、虚拟机是什么 虚拟机(Virtual Machine)是一种软…

PostgreSQL 免费的对象-关系数据库

目录 一、什么是数据库 二、ORDBMS 的一些术语 三、PostgreSQL 概述 四、PostgreSQL数据库优点和缺点 4.1PostgreSQL数据库的优点 4.2PostgreSQL数据库的缺点 4.3PostgreSQL 特征 五、Linux 上安装 PostgreSQL 5.1Yum 安装 PostgreSQL 5.1.1安装postgreSQL的官方yum仓…

华火电燃灶:重拾烹饪艺术的黄金法则,打造家庭美食的温馨记忆

记得在饭店给客户人炒菜的时候,炉灶下的每一道菜都透着诱人的香气。无论是炒肉还是炖汤,那股鲜香总让人回味无穷。然而,回到家,用上自家的燃气灶,发现同样的食材、同样的配方,味道却平淡无奇,仿…