【结构性型模式-适配器模式】

news2024/11/15 21:47:15

定义

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

结构

适配器模式(Adapter)包含以下主要角色:

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
类适配器模式

实现方式:定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件。
【例】读卡器:
现有一台电脑只能读取SD卡,而要读取TE卡中的内容的话就需要使用到适配器模式。创建一个读卡器,将E卡中的内容读取出来。类图如下:
在这里插入图片描述

package com.syn.adapter.class_adapter;

/*目标接口*/
public interface SDCard {
    /*从SD中读数据*/
    String readSD();
    /*从SD中写数据*/
    void writerSD(String msg);
}

package com.syn.adapter.class_adapter;

public class SDCardImpl implements SDCard{
    @Override
    public String readSD() {
        String msg = "SDCard read msg: test_SD";
        return msg;
    }

    @Override
    public void writerSD(String msg) {
        System.out.println("SDCard write msg:" + msg);
    }
}
package com.syn.adapter.class_adapter;

public interface TFCard {

    /*从TF中读数据*/
    String readTF();
    /*从TF中写数据*/
    void writerTF(String msg);
}
package com.syn.adapter.class_adapter;

/*适配者类*/
public class TFCardImpl implements TFCard{
    @Override
    public String readTF() {
        String msg = "TFCard read msg: test_TF";
        return msg;
    }

    @Override
    public void writerTF(String msg) {
        System.out.println("TFCard write msg:" + msg);
    }
}
package com.syn.adapter.class_adapter;

/*计算机类*/
public class Computer {
    /*从SD卡读取数据*/
    public String readsD(SDCard sdcard){
        if(sdcard == null)
            new NullPointerException("sd card is not null");
        return sdcard.readSD();
    }
}
package com.syn.adapter.class_adapter;

/*适配器类*/
public class SDAdapterTF extends TFCardImpl implements SDCard{
    @Override
    public String readSD() {
        System.out.println("adapter read tf card.");
        return readTF();
    }

    @Override
    public void writerSD(String msg) {
        System.out.println("adapter writer tf card.");
        writerTF(msg);
    }
}
package com.syn.adapter.class_adapter;

public class Client {
    public static void main(String[] args) {
        /*创建计算机对象*/
        Computer computer = new Computer();
        /*读取SD卡中的数据*/
        String msg = computer.readsD(new SDCardImpl());
        System.out.println(msg);


        System.out.println("=================");
        /*使用该电脑读取TF卡中的数据*/
        /*定义适配器类*/
        String msg1 = computer.readsD(new SDAdapterTF());
        System.out.println(msg1);
    }
}

在这里插入图片描述
类适配器模式违背了合成复用原则。类适配器是客户类有一个接口规范的情况下可用,反之不可用。

对象适配器模式

实现方式:对象适配器模式可采用将现有组件库中已经实现的组件引入适配器类中工该类同时实现当前系统的业务接口。
【例】读卡器:
我们使用对象适配器模式将读卡器的案例进行改写。类图如下:
在这里插入图片描述
代码中更改适配器类与客户端:

package com.syn.adapter.object_adapter;


/*适配器类*/
public class SDAdapterTF implements SDCard {

    /*声明适配者类*/
    private TFCard tfCard;

    public SDAdapterTF(TFCard tfCard){
        this.tfCard = tfCard;

    }
    @Override
    public String readSD() {
        System.out.println("adapter read tf card.");
        return tfCard.readTF();
    }

    @Override
    public void writerSD(String msg) {
        System.out.println("adapter writer tf card.");
        tfCard.writerTF(msg);
    }
}
package com.syn.adapter.object_adapter;

public class Client {
    public static void main(String[] args) {
        /*创建计算机对象*/
        Computer computer = new Computer();
        /*读取SD卡中的数据*/
        String msg = computer.readsD(new SDCardImpl());
        System.out.println(msg);


        System.out.println("=================");
        /*使用该电脑读取TF卡中的数据*/
        /*定义适配器类*/
        String msg1 = computer.readsD(new SDAdapterTF(new TFCardImpl()));
        System.out.println(msg1);
    }
}

注意:还有一个适配器模式是接口适配器模式。当不希望实现一个接口中所有的方法时,可以创建一个抽象类Adapter ,实现所有方
法。而此时我们只需要继承该抽象类即可。

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

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

相关文章

道达尔远景首个光储项目圆满收官,助力纺织业绿色转型

近日,由道达尔远景(TEESS)开发、设计、建设并运营的德州夏仁津和纺织分布式光储项目顺利并网发电。通过光伏发电与储能系统的有机结合,不仅满足了纺织厂的用电需求,也为纺织业的绿色转型注入了新动力。 我国是全球最大…

如何使用ParaView可视化工具来绘制点云数据的3D点云图像(亲测好用)

如何使用ParaView来绘制点云数据。以下是如何将你的数据导入ParaView并进行可视化的步骤 一、准备数据 首先,你需要将你的数据转换为ParaView可以读取的格式。ParaView支持多种文件格式,其中最常见的是.vtk和.csv格式。为了简单起见,这里我…

【Gradle】(三)详细聊聊依赖管理:坐标、依赖配置、依赖传递、依赖冲突

文章目录 1.概述2.依赖管理2.1.坐标2.2.依赖的基本概念2.3.依赖配置(Dependency configurations)2.3.1.依赖路径2.3.2.依赖配置与依赖路径的关联 2.4.依赖传递2.4.1.准备工作2.4.2.运行时依赖传递jar包生成与依赖配置依赖树打印使用 Dependency Analyzer…

mybatilsplaus 常用注解

官网地址 baomidou注解配置

数据高效交互丨DolphinDB Redis 插件使用指南

DolphinDB 是一个高性能的分布式数据库。通过 Redis 插件,DolphinDB 用户可以轻松地与 Redis 数据库进行交互。用户不仅可以从 DolphinDB 向 Redis 发送数据,实现高速的数据写入操作;还可以从 Redis 读取数据,将实时数据流集成到 …

关于嵌入式系统中的LED控制程序的一篇爽文

嵌入式系统中的LED控制程序 在嵌入式系统中控制LED是一个很常见的任务,可以用于指示状态、显示信息等。我们将使用C语言编写一个简单的LED控制程序,该程序将控制一个虚拟的LED,但可以根据需要将其扩展到实际的硬件上。 准备工作 在开始之前…

灯塔音乐网,灯塔音乐下载官网

音乐,这个无形的艺术,自古以来就伴随着人类的生活,成为了我们表达情感、沟通思想、寻求共鸣的重要桥梁。在我们的日常生活中,音乐无处不在,它不仅仅是一种娱乐方式,更是一种生活态度,一种精神寄…

从零开始做题:emoji

题目 给出一张图片 解题 from PIL import Image import random # 读取txt文件 with open("rgb.txt", "r") as file: lines file.readlines() # 跳过第一行(包含尺寸信息) lines lines[1:] # 提取RGB颜色值 colors…

职升网:初中毕业如通过什么方式考中专学历?

对于许多初中毕业生而言,想要进一步提升自己的学历,中专是一个不错的选择。考取中专学历需要遵循一定的步骤,以下是具体的指导: 了解中专入学要求: 首先,你需要详细了解不同中专学校的入学要求。这通常包…

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver gdb是一款开源的、强大的、跨平台的程序调试工具。主要用于在程序运行时对程序进行控制和检查,如设置断点、单步执行、查看变量值、修改内存数据等,从而帮助开发者定位和修复代码中的错误。 gdbserve…

熬了一晚上,我从零实现了 Transformer 模型,把代码讲给你听

自从彻底搞懂Self_Attention机制之后,笔者对Transformer模型的理解直接从地下一层上升到大气层,瞬间打通任督二脉。夜夜入睡之前,那句柔情百转的"Attention is all you need"时常在耳畔环绕,情到深处不禁拍床叫好。于是…

无线领夹麦克风怎么挑选,降噪麦克风能消除旁边人说话声吗?

在自媒体行业的蓬勃发展下,音频设备的地位愈发显著,尤其是麦克风这一关键组件。它见证了从传统新闻采访、电视节目制作到现代网络直播、个人视频日志(Vlog)的演变。随着技术的进步和应用场景的多样化,麦克风的种类也日…

软考分数线有3种,低于45分也能拿证!

软考合格分数标准是45分,这个是广泛为人所知的。然而,有些地区即使没有达到45分也可以获得证书,这一点许多考生并不清楚。总的来说,软考的合格标准有三种! ● 全国分数线:通常是各科45分及格,证…

将WordPress的文章重新排序的3个方法

有效的调整文章显示顺序看开可以更好突出内容,还可以保持网站的新鲜感,今天我将带您了解三种方法,通过重新排序文章显著提升网站的吸引力。我们将逐步讲解从调整设置到使用插件以及“置顶”文章的每一种方法,确保WordPress 新手也…

学生护眼台灯十大排名有哪些?品牌台灯质量前十的排名曝光!

在孩子学习过程中,有一样物品的重要性不容忽视,那就是一盏提供舒适光源的台灯。面对不断增加的学业负担,孩子们经常需要在夜晚借助台灯的光亮进行学习,这已经成为了家庭生活中普遍的情景。然而,我们必须给予足够的关注…

股票分析系统设计方案大纲与细节

股票分析系统设计方案大纲与细节 一、引言 随着互联网和金融行业的迅猛发展,股票市场已成为重要的投资渠道。投资者在追求财富增值的过程中,对股票市场的分析和预测需求日益增加。因此,设计并实现一套高效、精准的股票分析系统显得尤为重要。本设计方案旨在提出一个基于大…

智启未来,共筑工业软件新梦 ——清华大学博士生天洑软件实习启航

2024年6月30日,清华大学工程物理系、深圳国际研究生院、航天航空学院、机械工程系、能源与动力工程系的10名博士研究生抵达南京天洑软件有限公司,正式开启为期6周的博士生必修环节社会实践。 “天洑软件清华基地”成立于2021年,旨在为清华理工…

智能锁赛博化,凯迪仕携全球顶尖科技亮相建博会!

7月8日,作为大家居建材行业全球规模第一大展,2024中国建博会(广州)在广交会展馆正式拉开序幕。据官方数据显示,本届展会展出规模展览总规模近40万平方米,建筑装饰领域各细分题材的一线品牌几乎全部参展。 其…

[图解]企业应用架构模式2024新译本讲解24-标识映射3

1 00:00:00,460 --> 00:00:02,580 超类定义了一个抽象方法 2 00:00:03,170 --> 00:00:03,450 3 00:00:06,410 --> 00:00:09,690 把reader内容 4 00:00:10,870 --> 00:00:12,350 把它变成一个领域对象 5 00:00:13,690 --> 00:00:15,800 但这里只是把它变成一个…

SpringBoot + MyBatisPlus 实现多租户分库

一、引言 在如今的软件开发中,多租户(Multi-Tenancy)应用已经变得越来越常见。多租户是一种软件架构技术,它允许一个应用程序实例为多个租户提供服务。每个租户都有自己的数据和配置,但应用程序实例是共享的。而在我们的Spring Boot MyBati…