设计模式-适配器

news2024/10/6 6:04:08

文章目录

  • 一、简介
  • 二、适配器模式基础
    • 1. 适配器模式定义与分类
    • 2. 适配器模式的作用与优势
    • 3.UML图
  • 三、适配器模式实现方式
    • 1. 类适配器模式
    • 2. 对象适配器模式
    • 3.类适配器模式和对象适配器模式对比
  • 四、适配器模式应用场景
    • 1. 继承与接口的适配
    • 2. 跨平台适配
  • 五、适配器模式与其他设计模式关系
    • 1. 适配器模式与装饰器模式的区别与联系
    • 2. 适配器模式与桥接模式的区别与联系
  • 六、总结

一、简介

  • 设计模式概述
    设计模式是软件开发中常用的解决问题的经验总结,它们提供了一种被广泛接受的最佳实践。设计模式可以帮助开发人员更好地组织和设计代码,提高代码的可读性、可维护性和可扩展性。
  • 适配器模式介绍
    适配器模式(Adapter Pattern)是一种常用的结构型设计模式。它主要用于将一个类的接口转换成另一个类所期望的接口,以解决不兼容的接口之间的问题。适配器模式可以使得原本不兼容的类能够协同工作。
    适配器模式的核心思想是创建一个适配器类,该适配器类实现目标接口,并持有一个被适配的对象。适配器类在调用目标接口方法时,实际上会调用被适配对象的方法来完成相应的功能。
    适配器模式可以分为类适配器模式和对象适配器模式两种实现方式。类适配器模式使用继承来实现适配,而对象适配器模式使用组合来实现适配。两种方式各有优缺点,开发人员需要根据具体情况选择合适的方式来应用适配器模式。

二、适配器模式基础

1. 适配器模式定义与分类

适配器模式是一种结构型设计模式,它允许将不兼容的接口转换为可兼容的接口。根据适配器与被适配者之间的关系,适配器模式可以分为类适配器模式和对象适配器模式。

2. 适配器模式的作用与优势

适配器模式的主要作用是解决两个不兼容接口之间的兼容性问题,使得它们能够协同工作。适配器模式的优势包括:

  • 提供接口的转换,使得原本不兼容的类能够协同工作。
  • 可以增加额外的逻辑处理,如数据转换、格式化等。
  • 提高代码的复用性和灵活性。

3.UML图

在这里插入图片描述

三、适配器模式实现方式

1. 类适配器模式

在类适配器模式中,适配器通过继承被适配的类和实现目标接口的方式来实现适配。

// 被适配者类
public class Adaptee {
    public void specificRequest() {
        System.out.println("执行被适配者的方法");
    }
}

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

// 适配器类
public class ClassAdapter extends Adaptee implements Target {
    public void request() {
        specificRequest();  // 调用被适配者类的方法
    }
}

2. 对象适配器模式

在对象适配器模式中,适配器通过持有被适配的对象,并实现目标接口的方式来实现适配。

// 被适配者类
public class Adaptee {
    public void specificRequest() {
        System.out.println("执行被适配者的方法");
    }
}

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

// 适配器类
public class ObjectAdapter implements Target {
    private Adaptee adaptee;  // 持有被适配者实例

    public ObjectAdapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void request() {
        adaptee.specificRequest();  // 调用被适配者类的方法
    }
}

3.类适配器模式和对象适配器模式对比

类适配器模式和对象适配器模式是适配器模式的两种常见实现方式,它们在实现上有一些差异和优缺点。

  1. 类适配器模式:

    • 实现方式:通过继承被适配的类并实现目标接口来进行适配。
    • 优点:
      • 可以重写被适配类的方法,实现定制化的适配逻辑。
      • 适配器类可以访问被适配类的成员变量和方法。
    • 缺点:
      • 适配器只能适配单个类,无法适配一个类和它的子类。
      • 适配器类与被适配类紧密耦合,限制了适配器的灵活性。
  2. 对象适配器模式:

    • 实现方式:通过持有被适配的对象,并实现目标接口来进行适配。
    • 优点:
      • 适配器可以适配多个不同的被适配类,灵活性较高。
      • 适配器类与被适配类解耦,使得适配器更加独立,易于复用。
    • 缺点:
      • 无法重写被适配类的方法,只能通过调用被适配类的方法来实现适配逻辑。

总结:

  • 类适配器模式适合于需要重写被适配类的方法,或者只适配一个类且希望能直接访问被适配类的成员变量和方法。
  • 对象适配器模式适合于适配多个不同的被适配类,或者希望适配器与被适配类解耦,提供更高的灵活性和复用性。

四、适配器模式应用场景

1. 继承与接口的适配

  • 在已有类上添加适配器:当已有类实现了某个接口的部分方法,但又无法满足其他接口的实现要求时,可以通过适配器继承已有类并实现目标接口的方式来适配。
  • 接口适配器模式:当一个接口拥有多个方法,而我们只需要实现其中的部分方法时,可以通过接口适配器模式解决。

2. 跨平台适配

跨平台适配是适配器模式的常见应用场景之一。通过适配器模式,可以实现不同平台之间的兼容性,使得代码具备可移植性和跨平台性。

五、适配器模式与其他设计模式关系

1. 适配器模式与装饰器模式的区别与联系

适配器模式和装饰器模式都属于结构型设计模式,但它们的作用和用途不同。

  • 适配器模式主要用于接口兼容和转换,使得原本不兼容的类能够协同工作。
  • 装饰器模式主要用于给对象动态添加额外的行为或责任。

2. 适配器模式与桥接模式的区别与联系

适配器模式和桥接模式也有相似之处,但两者的设计意图和应用场景不同。

  • 适配器模式用于将一个类的接口转换成另一个客户端所期望的接口,解决接口不兼容的问题。
  • 桥接模式用于将抽象部分与实现部分分离,使它们可以独立变化。

六、总结

适配器模式是一种常用的设计模式,用于解决接口不兼容的问题。通过类适配器和对象适配器两种实现方式,可以将不兼容的接口转换为可兼容的接口,并提供额外的逻辑处理。在实际开发中,适配器模式具有重要的应用价值,可以提高代码的复用性和灵活性。

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

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

相关文章

无涯教程-Python机器学习 - Extra Trees函数

它是袋装决策树集成方法的另一种扩展。在这种方法中,从训练数据集的样本中构建随机树。 在以下Python食谱中,我们将通过在Pima Indians糖尿病数据集上使用sklearn的ExtraTreesClassifier类来构建额外的树集成模型。 首先,导入所需的软件包,如下所示: from pandas import rea…

Nginx详解 三:高级配置

文章目录 1. 网页的状态页2. Nginx第三方模块2.1 echo模块 3. 变量3.1 内置变量3.1.1 示例 3.2 自定义变量3.2.1 自定义访问日志3.2.2 自定义json 格式日志 3.4 Nginx压缩功能 4. HTTPS4.1 Nginx的HTTPS工作原理4.2 启用功能模块的配置过程 5、自定义图标 1. 网页的状态页 基于…

江苏移动基于OceanBase稳步创新推进核心数据库分布式升级

*本文首发自《中国电信业》 数字经济时代,数据库作为企业核心数据存储、处理、挖潜等方面的关键载体,重要性日益凸显。对于运营商而言,数据库具有行业用户数量多、访问数量多、业务复杂度高、数据安全性高、响应要求性高以及需要 7*24 小时服…

【组合计数 or 树DP】2021 icpc 上海 G

Problem - G - Codeforces 题意&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn1e610; const int mxv1e610; const int mod998244353;vector<int> G[mxn];int N,u,v; int ans1; int sz[mxn];void…

手把手教你写出第一个C语言程序

Hello, World! 1. 前言2. 准备知识2.1 环境2.2 文件的分类2.3 注释2.3.1 注释的作用2.3.2 注释的两种风格2.3.2.1 C语言的注释风格2.3.2.2 C的注释风格 2.3.3 VS中注释和取消注释的快捷键 3. 开始演示3.1 创建项目3.2 创建源文件3.3 写代码3.4 编译链接运行 4. 代码解释4.1 写主…

Apipost:API文档、调试、Mock与测试的一体化协作平台

随着数字化转型的加速&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为企业间沟通和数据交换的关键。而在API开发和管理过程中&#xff0c;API文档、调试、Mock和测试的协作显得尤为重要。Apipost正是这样一款一体化协作平台&#xff0c;旨在解决这些问题&#xf…

QT 使用信号与槽实现界面跳转

一、创建一个新的页面 1 > 在原有工程上新建一个页面 2 > 选择Qt - Qt 设计师界面类 - choose 3 > 选择Widget模板 - 下一步 4 > 输入自定义类名 - 下一步 会自动生成其同名的.h .cpp .ui文件 5 > 最终效果 Headers存放.h文件 Soueces存放.cpp文件 Forms存放.u…

unity 之参数类型之引用类型

文章目录 引用类型引用类型与值类型的差异 引用类型 在Unity中&#xff0c;引用类型是指那些在内存中存储对象引用的数据类型。以下是在Unity中常见的引用类型的介绍&#xff1a; 节点&#xff08;GameObject&#xff09;&#xff1a; 在Unity中&#xff0c;游戏对象&#xff…

学习 使用pandas库 DataFrame 使用

1 、 数据排序 sort_values()函数 by:要排序的名称或名称列表&#xff0c; sorted_df df.sort_values(byAge,ascendingFalse) 由大到小排序&#xff1b; sorted_df df.sort_values(byAge) 由小到大排序&#xff1b; # 创建一个示例数据帧 data {Name: [Tom, Nick, John…

9.嵌套路由

1.添加主路由main <template><div><!-- 页面布局 --><el-container><!-- 侧边栏 --><el-aside width"200px">Aside</el-aside><!-- 页面布局 右边 包括header 和main --><el-container><el-header>Head…

08:STM32----DMA数据转运

目录 1:简历 2:存储器映像 3:DMA基本结构 4: DMA转运的条件 5:DMA请求 A:DMA数据转运 1:连接图 2:数据转运DMA 3:函数介绍 4:步骤 5:代码 B:DMAAD多通道 1:连接图 2:结构图 3:函数介绍 4:代码 1:简历 DMA&#xff08;Direct Memory Access&#xff09;直接存储…

讲讲几道关于 TCP/UDP 通信的面试题

TCP &#xff08;1&#xff09;TCP 的 accept 发生在三次握手的哪个阶段&#xff1f; 如下图connect和accept的关系&#xff1a; accept过程发生在三次握手之后&#xff0c;三次握手完成后&#xff0c;客户端和服务器就建立了tcp连接并可以进行数据交互了。这时可以调用accep…

每日一题(链表的中间节点)

每日一题&#xff08;链表的中间节点&#xff09; 876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 如下图&#xff1a;可以定义两个结构体指针均从链表的头节点开始向后遍历&#xff0c;fast指针一次走两步&#xff0c;slow指针一次走一步&a…

RC电路(二):耦合

耦合仿真电路及波形 数值与输入方波宽度 之间满足&#xff1a;&#xff0c;将变成一个 耦合电路&#xff0c;输出波形可以跟随输入波形&#xff0c;电路如下图所示。 上图红框部分放大后如下图所示&#xff1a; 在 时&#xff0c; 由 &#xff0c;因电容电压不能突变(来不及…

第一方支付、第二方支付、第三方支付、第三方支付是什么?

我相信关于支付行业大家多多少少都有一些自己的理解&#xff0c;但是具体的一些名词如标题中的这些&#xff0c;第一方、第二方、第三方支付&#xff0c;到底指的是什么&#xff1f; 第一方支付 也就是现金支付&#xff0c;其本质的意义就是指货币支付&#xff0c;从最早出现货…

IDEA配置使用Gradle

IDEA如何配置 Gradle&#xff08;详细版&#xff09; 使用国内镜像仓库加速下载依赖包

docker-compose 部署nacos 整合 postgresql 为DB

标题docker-compose 部署nacos 整合 postgresql 为DB 前提&#xff1a; 已经安装好postgresql数据库 先创建好一个数据库 nacos&#xff0c;执行以下sql: /** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache License, Version 2.0 (the "…

为什么人与人之间的差距这么大?

前言 首先要明确的是&#xff0c;与身边的人相比&#xff0c;每个人的生活情况和经历都是不同的&#xff0c;有差距是非常正常的。因此&#xff0c;不需要过度关注自己与他人之间的差距。个人感受 在生活中&#xff0c;工作中&#xff0c;学习中&#xff0c;不免遇上一些各方…

2023年全国职业院校技能大赛信息安全管理与评估网络安全渗透任务书

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 任务书 模块三 网络安全渗透、理论技能与职业素养 比赛时间及注意事项 本阶段比赛时长为180分钟&#xff0c;时间为9:00-12:00。 【注意事项】 &#xff08;1&#xff09;通过找到正确的flag值来获取得分&#xff0c;f…

【防火墙】防火墙NAT Server的配置

Web举例&#xff1a;公网用户通过NAT Server访问内部服务器 介绍公网用户通过NAT Server访问内部服务器的配置举例。 组网需求 某公司在网络边界处部署了FW作为安全网关。为了使私网Web服务器和FTP服务器能够对外提供服务&#xff0c;需要在FW上配置NAT Server功能。除了公网…