设计模式:Adapter(适配器)--类对象结构型模式

2023-11-10

一、介绍

Adapter(适配器)也叫做包装器(wrapp)。在许多时候横夺得类不能够被复用,仅仅是因为将一个类的接口与专业应用得接口不匹配。当一些类的接口互不兼容,这时候就需要适配器。它能将一个类的接口转化为客户希望的另一个接口。Adapter模式使得由于接口不兼容不能在一起工作得那些类可以在一起工作。

  • 优点:
    1.类的透明性
    2.类的复用度
    3.灵活性
    4.可以让任何两个没有关联的类一起运行
  • PS:
    项目一定要遵守依赖倒置原则和里氏替换原则,否则即使在适合使用适配器的场合下,也会带来非常大的改造

二、适用性

  • 当你想使用一个已经存在的类,但他的接口不符合你的需求
  • 当你想创建一个可以复用的类,该类可以与其他不相关的类或不可遇见的类(接口可能不一定兼容的类)一起协同工作
  • 你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配他的父类接口。

三、参与者

在这里插入图片描述

  • Target
    定义Client使用的与特定邻域相关的接口
  • Client
    与符合Target接口的对象协同
  • Adaptee
    定义一个已经存在的接口,这个接口需要适配
  • Adapter
    对Adaptee的接口与Target接口进行适配

四、效果

类适配器
  • 用一个具体的Adapter类对Adaptree和Target进行匹配。结果是当我们想要匹配一个类以及他的子类的时候,类Adapter不能够胜任工作
  • 使得Adapter可以重新定义adaptee的部分行为,因为Adapter是Adaptee的一个子类
  • 仅仅引入一个对象,并不需要二外的指针间接得到Adaptee
对象适配器
  • 允许一个Adapter与多个Adaptee–Adaptee本身以及他的所有子类同时工作。Adapter可以一次给所有的Adaptee添加功能
  • 使得重新定义Adaptee的行为比较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是应用Adaptee

五、实现

我们现在来看一个例子:

当我们在读书的时候都知道,有本校学生,还有寄读学生(学籍不再所就读学校)。我们想想这样一个场景。有一所高中的学生信息管理系统,由由于之前一直都是本校的学生就读,没有寄读学生。但是后来来了一部分寄读学生,这时候寄读学生信息需要从原来学校接口获取。但是寄读学生的学籍所在高校只提供Map接口,这时候是不是就陷入难题,于是就出现了适配器。

  • UML:
    在这里插入图片描述

  • 代码:

StudedntInfo接口:本校学生信息管理接口

public interface StudentInfo {

    String getName();

    String getAge();

    String getAdress();

    String getIDCard();

    String getMaName();

    String getFaName();

    String getMaPhone();

    String getFaPhone();
}

studentImp类:实现studentInfo接口

public class StudentImp implements StudentInfo{

    @Override
    public String getName() {
        System.out.println("测试学生姓名");
        return null;
    }

    @Override
    public String getAge() {
        System.out.println("测试学生年龄");
        return null;
    }

    @Override
    public String getAdress() {
        System.out.println("测试学生家庭住址");
        return null;
    }


    @Override
    public String getIDCard() {
        System.out.println("测试学生身份证号");
        return null;
    }

    @Override
    public String getMaName() {
        System.out.println("测试学生母亲姓名");
        return null;
    }

    @Override
    public String getFaName() {
        System.out.println("测试学生母亲电话");
        return null;
    }

    @Override
    public String getMaPhone() {
        System.out.println("测试学生父亲姓名");
        return null;
    }

    @Override
    public String getFaPhone() {
        System.out.println("测试学生父亲电话");
        return null;
    }
}

接口OutStudentInfo:寄读学生接口(Map类型)

public interface OutStudentInfo {
    //学生个人信息
    Map selfInfo();

    //学生家长信息
    Map parentInfo();
}

OutStudentImp:寄读学生实现类,实现OutStudentInfo接口

public class OutStudentImp implements OutStudentInfo{
    @Override
    public Map selfInfo() {
        Map student = new HashMap();
        student.put("name","测试寄读学生姓名");
        student.put("age","测试寄读学生年龄");
        student.put("sex","测试寄读学生性别");
        student.put("adress","测试寄读学生家庭住址");
        student.put("ID","测试寄读学生身份证号");

        return student;
    }

    @Override
    public Map parentInfo() {
        Map parent = new HashMap();
        parent.put("maName","测试寄读学生母亲姓名");
        parent.put("maPhone","测试寄读学生母亲电话");
        parent.put("faName","测试寄读学生父亲姓名");
        parent.put("faPhone","测试寄读学生父亲电话");
        return parent;
    }
}

Adapter适配器:继承OutStudentImp寄读学生实现类,实现StudentInfo接口

public class Adapter extends OutStudentImp implements StudentInfo{

    private Map student =super.selfInfo();
    private Map parent = super.parentInfo();

    @Override
    public String getName() {
        String name = (String) this.student.get("name");
        System.out.println(name);
        return name;
    }

    @Override
    public String getAge() {
        String age = (String) this.student.get("age");
        System.out.println(age);
        return age;
    }

    @Override
    public String getAdress() {
        String adress = (String) this.student.get("adress");
        System.out.println(adress);
        return adress;
    }

    @Override
    public String getIDCard() {
        String ID = (String) this.student.get("ID");
        System.out.println(ID);
        return ID;
    }

    @Override
    public String getMaName() {
        String name = (String) this.parent.get("maName");
        System.out.println(name);
        return name;
    }

    @Override
    public String getFaName() {
        String name = (String) this.parent.get("faName");
        System.out.println(name);
        return name;
    }

    @Override
    public String getMaPhone() {
        String phone = (String) this.parent.get("maPhone");
        System.out.println(phone);

        return phone;
    }

    @Override
    public String getFaPhone() {
        String phone = (String) this.parent.get("faPhone");
        System.out.println(phone);
        return phone;
    }
}

测试:

public class Main {
    public static void main (String[] args){
        StudentInfo student1 = new StudentImp();
        StudentInfo student2 = new Adapter();
        student1.getName();
        student1.getAdress();
        student1.getAge();
        student1.getIDCard();
        student1.getMaName();
        student1.getMaPhone();
        student1.getFaName();
        student1.getFaPhone();
        System.out.println("-------------------");
        student2.getName();
        student2.getAdress();
        student2.getAge();
        student2.getIDCard();
        student2.getMaName();
        student2.getMaPhone();
        student2.getFaName();
        student2.getFaPhone();

    }
}

结果:
在这里插入图片描述



❤️往期redis内容:可在博客中直接查看❤️
设计模式:Factory method(工厂模式)–创建型模式
设计模式:Factory method(工厂模式)–创建型模式
设计模式:Builder(生成器)–创建型模式
小白学设计模式–单例模式(singleton)

Redis进阶:主从复制–小白的进阶教程(理论:一文搞懂主从复制)


❤️ 如有错误欢迎指出❤️
❤️ 点击访问更多个人博客 www.wslhome.top❤️

❤️每天进步一点点 ❤️

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式:Adapter(适配器)--类对象结构型模式 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • linux如何复制文件夹和

    CP命令 格式 CP 选项 源文件或目录 目的文件或目录 选项说明 b 同名 备分原来的文件 f 强制覆盖同名文件 r 按递归方式保留原目录结构复制文件 cp r tmp a root a 记得有空格 1 vi filename 打开或新建
  • 【C++】类的前置声明

    两个类要互相引用 就会出现 未定义 尴尬 此时可以用前置声明来解决 class person 类的前置声明 class Animal public void eat person pn class person public friend
  • Qt串口接收一帧不完整问题

    1 串口通信接收不全问题 在触发接收后 调用一次waitForReadyRead 等待100ms 后续再readAll 目前都能完整接收一帧 connect m serialPort SIGNAL readyRead this SLOT r
  • xcode中如何显示文件后缀

    xcode14 3 用不惯mac电脑真恶心 改个显示文件后缀找半天 1 首先双击打开xcode软件 2 此时 电脑左上角出现xcode字样 左上角如果看不到xcode字样 再次点击xcode软件弹出来就有了 鼠标右键它 点击setting或
  • 安装zookeeper详解教程(windows单机版)(以及解决方法)

    1 下载安装包 Apache官网下载 我选的比较稳定的旧版本 地址 Apache ZooKeeperhttps zookeeper apache org releases html 2 解压到本地目录 3 配置文件 进入conf目录下将zo
  • A. Doremy‘s IQ(贪心)

    Problem A Codeforces 题意 一个人的IQ为q 有n场比赛 第i天只能参加第i场比赛 如果比赛难度大于IQ 那么IQ就会下降 如果IQ为0就不能参加比赛了 问最多能参加多少场比赛 输入一个01串 0表示不参加 1表示参加
  • 【nlp-with-transformers】

    今天社群中的小伙伴面试遇到了一个问题 如何保证生成式语言模型在同样的输入情况下可以保证同样的输出 这里面造成问题的因素有两个方面 一个方面是在forward过程中参数的计算出现了差异 这种情况一般发生在游戏显卡中 游戏显卡无法保证每一次底层
  • 基于用户的协同过滤算法(userCF)

    1 定义 userCF 当一个用户A需要个性化推荐时 可以先找到和他有相似兴趣的其他用户 然后把那些用户喜欢的 而用户A没有听说过的物品推荐给A 这种方法称为基于用户的协同过滤算法 基于用户的协同过滤算法主要包括两个步骤 2 第一步 找到和
  • c++ java rgb与nv21互转

    目录 jni函数 c rgb转nv21 可以转 不报错 但是转完只有黑白图 java yuv420保存图片 先转nv21 再保存ok c yuv420月bgr互转 测试ok jni函数 JNIEXPORT void JNICALL Java
  • 一.安装deepin

    笔记本是联想拯救者y7000 原配 cpu i5 8300h 三星内存8g 固态128g 2T机械 独显是nvidia gtx1050ti 后加装16G同品牌同频率内存组24G内存 固态128卸掉换512 伴随着几次win10升级 电脑待机
  • kingbaseES查询数据库里一个模式下所有的表以及大小

    1 例如以public模式为样例 SELECT table name sys size pretty table size AS table size sys size pretty indexes size AS indexes size
  • react usestate 更新_React中setState同步更新策略

    setState 同步更新 我们在上文中提及 为了提高性能React将setState设置为批次更新 即是异步操作函数 并不能以顺序控制流的方式设置某些事件 我们也不能依赖于this state来计算未来状态 典型的譬如我们希望在从服务端抓
  • 静态时序分析——单周期

    一 建立时间的检查 建立时间的检查是指检查电路里每一个触发器的数据和时钟的关系是否满足建立时间的要求 我们以上图为例进行建立时间检查 由图可知 我们主要针对第二个触发器UFF1进行检查 我们可以梳理时序关系如下 通过这个图 我们可以得到满足
  • 01 二叉树的BFS(广度、层次或水平遍历实现)【Binary Tree 二叉树】

    二叉树的遍历分为BFS和DFS两种大类 下面完整实现BFS遍历二叉树 例如二叉树 1 2 3 4 5 BFS遍历结果 1 2 3 4 5 具体的代码实现 方法一 采用递归遍历的方法实现 Recursive C program for lev
  • el-dialog分析

  • 上海AI实验室与商汤科技等发布“书生·浦语”大语言模型

    随着AI大语言模型越来越多地表现出接近人类的智能 面向人类设计的高难度 综合性考试被越来越多地引入对语言模型的智能水平进行评测 OpenAI在其关于GPT 4的技术报告中就主要通过各领域的考试对模型能力进行检验 2023年高考开考 中文大语
  • vue环境配置

    一 安装nvm 介绍 https zhuanlan zhihu com p 38819529 安装包 https github com coreybutler nvm windows releases 注意 安装路径不能有中文或者空格 在安
  • java输入输出的方法

    java输入输出 目录 一 控制台输入输出 二 文件读写 一 控制台输入输出 java控制台的输入输出主要依赖于scanner类 使用Scanner scanner new Scanner System in 获取了控制台输入的字段 其中s
  • 因果系列文章(9)——反事实(下)

    4月4日 新冠病毒全球累计确诊已经突破100万 其中美国已超过24万 4月2日 外交部新闻发言人华春莹在新闻发布会上质问美国 如果当初最先发生疫情的国家是美国 而不是中国 美国会处理的比中国更好吗 我们难以假设那种情况的存在 但是从美国现在
  • 设计模式:Adapter(适配器)--类对象结构型模式

    一 介绍 Adapter 适配器 也叫做包装器 wrapp 在许多时候横夺得类不能够被复用 仅仅是因为将一个类的接口与专业应用得接口不匹配 当一些类的接口互不兼容 这时候就需要适配器 它能将一个类的接口转化为客户希望的另一个接口 Adapt