适配器模式的学习与使用

news2024/11/18 1:43:41

1、适配器模式的学习

  当我们需要将一个类的接口转换成另一个客户端所期望的接口时,适配器模式(Adapter Pattern)可以派上用场。它允许不兼容的接口之间能够协同工作。
  适配器模式属于结构型设计模式,它包含以下几个角色:

  1. 目标接口(Target Interface):客户端所期望的接口,也是适配器类要实现的接口。
  2. 适配器(Adapter):适配器类将被适配者的接口转换成目标接口。它实现了目标接口,并包含一个对被适配者的引用。
  3. 被适配者(Adaptee):被适配者是我们需要将其接口转换的类。它拥有客户端所不兼容的接口。
      适配器模式的核心思想是通过适配器类来包装被适配者,使其能够与目标接口协同工作。适配器在自身的实现中调用被适配者的方法,将其转换成客户端所期望的接口形式。
      适配器模式可以有两种实现方式:
    类适配器模式:适配器类继承被适配者类,并实现目标接口。通过继承,适配器类同时具有目标接口和被适配者的特性。
    对象适配器模式:适配器类持有被适配者对象的引用,并实现目标接口。通过对象组合,适配器类可以调用被适配者对象的方法来实现目标接口。
    在这里插入图片描述

2、适配器模式的使用

  因为类适配器模式涉及到了继承,相对于对象适配器模式耦合度增加了;所以推荐使用对象适配器模式,代码示例以对象适配器模式为例。
  假设你正在开发一个多媒体播放器应用程序,它可以播放不同格式的音频文件,如MP3、WAV和FLAC。现在你需要添加对新的音频格式OGG的支持,但是你的播放器类只能接受实现了MediaPlayer接口的类。你需要使用适配器模式来将OGGPlayer适配成符合MediaPlayer接口的类。
  MediaPlayer接口

/**
 * @author myf
 * 播放器
 */
public interface MediaPlayer {


    /**
     * 播放
     */
    void play();
}

  OGGPlayer接口及实现类

/**
 * @author myf
 * OGGPlayer 接口
 */
public interface OGGPlayer {

    /**
     * OGG格式媒体播放
     */
    void play();
}
/**
 * @Author: myf
 * @CreateTime: 2023-06-02  21:19
 * @Description: OGGPlayerImpl OGG格式播放类
 */
public class OGGPlayerImpl implements OGGPlayer{

    @Override
    public void play() {
        System.out.println("OGG格式媒体开始播放");
    }
}

  适配器

/**
 * @Author: myf
 * @CreateTime: 2023-06-02  21:33
 * @Description: OGGPlayerAdapter   OGG格式媒体适配器类
 */
public class OGGPlayerToMediaPlayerAdapter implements MediaPlayer {

    private OGGPlayer oggPlayer;

    public OGGPlayerToMediaPlayerAdapter(OGGPlayer oggPlayer) {
        this.oggPlayer = oggPlayer;
    }

    @Override
    public void play() {
        oggPlayer.play();
    }
}

  客户端

public class MediaClient {
    
    public static void main(String[] args) {
        //播放OGG格式媒体
        play(new OGGPlayerToMediaPlayerAdapter(new OGGPlayerImpl()));
    }

    private static void play(MediaPlayer mediaPlayer) {
        mediaPlayer.play();
    }
}
OGG格式媒体开始播放

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

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

相关文章

2、数据库:SQL Server部署 - 系统部署系列文章

对于微软的SQL Server的安装,以前已经有写过了,到了2022版本,安装没多大的改变,很多只需要少配置,然后直接下一步即可。现在是2023年了,SQL Server已经出到了2022版本,这篇博文就再次对SQL Serv…

chatgpt赋能python:Python列表按长度排序的方法

Python列表按长度排序的方法 在Python编程中,列表是最常用的数据结构之一。列表是一种可变的有序序列,可以包含任意类型的对象。有时候,我们需要对列表按照元素的长度进行排序。本文将介绍Python中列表按长度排序的两种方法。 方法一&#…

pytorch实战 -- 神经网络

softmax的基本概念 交叉熵损失函数 模型训练和预测 在训练好softmax回归模型后,给定任一样本特征,就可以预测每个输出类别的概率。通常,我们把预测概率最大的类别作为输出类别。如果它与真实类别(标签)一致&#xff0…

chatgpt赋能python:Python列表排序详解:从基础排序到高级算法

Python 列表排序详解:从基础排序到高级算法 在 Python 编程中,列表是常用的数据类型。列表的排序是其中重要的操作之一。Python 提供了多种方法来对列表进行排序,从简单的基础排序到高级的算法排序。在这篇文章中,我们将详细介绍…

找到 FSM 的区别序列、UIO 或特征集(W方法)

找到 FSM 的区别序列、UIO 或特征集(W方法) 1 简介 许多系统都是基于状态的:它们有一个更新的内部状态通过操作并影响行为。 在测试这样一个系统时,一个需要考虑状态。 这导致了一系列的语言,用于描述基于状态的规范和模型,这些可…

并发编程-系统学习篇

并发编程的掌握过程并不容易。 我相信为了解决这个问题,你也听别人总结过:并发编程的第 一原则, 那就是不要写并发程序 这个原则在我刚毕业的那几年曾经是行得通的,那个时候多核服务器还是一种奢侈品,系统的并发量也很…

沙盒不再高端,Windows11将自带沙盒让程序检测更方便

Windows 沙盒提供了轻型桌面环境,可以安全地在隔离状态下运行应用程序。 安装在 Windows 沙盒环境下的软件保持“沙盒”状态,并且与主机分开运行。 沙盒是临时的。 当关闭沙盒后,系统将删除所有软件和文件以及状态。 每次使用时,…

AWK常用用法

awk简介 awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,…

解决一个典型的商业案例研究任务

介绍 印尼的一家公司 Gojek 通过移动应用程序提供运输和物流、食品和购物、支付、日常需求、商业、新闻和娱乐等服务,对经济做出了超过70亿美元的贡献。 它拥有 90 万注册商户、超过 1.9 亿次应用下载以及超过 200 万名司机能够在120分钟内完成超过18万个订单。我们…

chatgpt赋能python:Python创建界面的重要性及实现方法

Python创建界面的重要性及实现方法 作为一名有10年Python编程经验的工程师,我深知Python在Web开发、数据分析和人工智能等方面的强大表现。然而,Python对于前端的支持一直是一个不被关注的领域。 随着网站、移动应用和电脑软件的普及,用户对…

Find My产品|Targus推出最新支持苹果Find My双肩包

Targus宣布推出 Cypress Hero Backpack 双肩包,最大的亮点在于支持苹果“Find My”,在丢失后可定位追踪。 Targus这款双肩包采用了环保材料,可以妥善地保护笔记本电脑,并提供丰富的收纳袋存放各种配件和物品。这款双肩包内置带衬…

Unity Addressables学习笔记(3)---加载远程场景Scenes

前言 Unity Addressables学习笔记—汇总 正文 1.创建一个新场景 我是创建在Resources/Scenes目录下,如图: 2.为场景创建一个Addressables的Group Game1Group就是我新创建的一个Group用来存放场景1的所有资源,分组的配置跟Remote一样&a…

vue 读取本地文件

1. vue读取本地文件 2.在文件夹下添加一个类 3.读取本地文件,先读取文件的内容 4.在 body下添加一个属性 5.读取后,写到 setTimeout方法中,返回一个错误信息。 6. restart方法,在组件渲染时调用 7. return setTimeout &#xff08…

使用Redis的zset集合实现小程序的滚动分页

一、 Redis中,使用有序集合(sorted set)实现滚动分页的原理如下: 将每个文档的 score 值设置为时间戳(或根据其他规则计算的分数),将文档的 ID 作为 value,然后将其添加到有序集合中…

delphi 开发虚拟摄像头

用directshow创建一个虚拟摄像头 然后注册到系统, 在用一个main app 调用摄像头,往里面写流, 可以是屏幕录制,可以是播放的多媒体文件 然后具体是要实现录屏,或者播放多媒体文件,在虚拟摄像头插件中fil…

Godot 4 源码分析 - 初探

准备研究GoDot 4源码。 源码下载 获取源代码 在进入 SCons 构建系统并编译 Godot 之前,你需要将 Godot 的源代码下载到本地。 源代码位于 GitHub 上, 虽然你可以通过网站手动下载它, 但是通常你希望通过 git 版本控制系统来下载. 如果你是为了做贡献或拉动请求…

国产新秀---XS5018A,芯昇,图像信号处理芯片

国产视频处理芯片,大崛起。 XS5018A 是一款针对 CMOS 图像传感器的高性价比图像信号处理芯片,支持 1M/2M 像素 图像传感器,一组 10-bit DVP 输入接口, ISP 具备优异的 3D 降噪功能,标清模拟输出支持 960…

Java官方笔记6继承

继承 Java只有单继承,最顶级的父类是Object。 子类会继承父类的fields和methods,而不会继承constructors,因为constructors不属于methods,但是子类可以通过super调用父类的constructor。 子类继承父类的范围是:public、…

记录--让URL地址都变成了ooooooooo

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 发现一个很有创意的小工具网站,如封面图所示功能很简单,就是将一个URL地址转换为都是 ooooooooo 的样子,通过转换后的地址访问可以转换回到原始地址,简单…

chatgpt赋能python:Python创建Word文档指南

Python创建Word文档指南 在今天的数字时代,Word文档仍然是最常见和使用的文档类型之一。Python是一个强大的编程语言,可以用于自动化创建各种类型的文档,包括Word文档。在本篇文章中,我们将介绍如何使用Python创建Word文档&#…