java设计模式(七)适配器模式(Adapter Pattern)

1、模式介绍:

        适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另外一个接口。适配器模式通常用于需要复用现有的类,但是接口与客户端的要求不完全匹配的情况。它包括两种形式:类适配器模式和对象适配器模式。

2、应用场景:

         系统需要使用现有的类,而这些类的接口不符合需求。
        不想修改现有的接口,而又需要复用该接口的情况。
        多个类似功能的接口需要统一。

3、优点:

        增加了类的透明性和复用性:将具体的实现封装在适配器中,对客户端来说是透明的,同时提高了被适配类的复用性。
        灵活性好:通过适配器,可以在不改变原有代码的基础上增加新的适配器类,符合开闭原则。

4、缺点:

        过多使用适配器,会让系统非常零乱。
        增加系统的复杂性
:因为增加了额外的适配器,可能会增加系统的理解难度

5、代码实现:

/**
 * 适配接口
 *
 * @author FM_南风
 * @date 2024/6/27 13:53
 */
public interface MediaPlayer {
    void play(String mediaType, String fileName);
}

/**
 * 被适配者
 *
 * @author FM_南风
 * @date 2024/6/27 13:54
 */
public class AudioPlayer implements MediaPlayer{
    @Override
    public void play(String mediaType, String fileName) {
        if (mediaType.equalsIgnoreCase("mp3")) {
            System.out.println("播放MP3文件: " + fileName);
        } else {
            System.out.println("使用" + mediaType + "媒体播放");
        }
    }
}

/**
 * 新适配接口
 *
 * @author FM_南风
 * @date 2024/6/27 13:55
 */
public interface AdvancedMediaPlayer {
    void playVlc(String fileName);
    void playMp4(String fileName);
}

/**
 * Mp4播放器实现新的接口
 *
 * @author FM_南风
 * @date 2024/6/27 13:56
 */
public class Mp4Player implements AdvancedMediaPlayer{
    @Override
    public void playVlc(String fileName) {

    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("播放MP4文件: " + fileName);
    }
}

/**
 * Vlc播放器实现新的接口
 *
 * @author FM_南风
 * @date 2024/6/27 13:56
 */
public class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("播放Vlc文件: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {

    }
}

/**
 * 适配器类,实现目标接口并持有被适配者的引用
 *
 * @author FM_南风
 * @date 2024/6/27 13:57
 */
public class MediaAdapter implements MediaPlayer{

    AdvancedMediaPlayer advancedMusicPlayer;

    public MediaAdapter(String mediaType) {
        if (mediaType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer = new VlcPlayer();
        } else if (mediaType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String mediaType, String fileName) {
        if (mediaType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer.playVlc(fileName);
        } else if (mediaType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer.playMp4(fileName);
        }
    }
}


/**
 * 应用
 *
 * @author FM_南风
 * @date 2024/6/27 13:58
 */
public class AdapterClient {

    public static void main(String[] args) {
        MediaPlayer audioPlayer = new AudioPlayer();

        audioPlayer.play("mp3", "音乐.mp3");
        audioPlayer.play("mp4", "视频.mp4");
        audioPlayer.play("vlc", "视频.vlc");
        audioPlayer.play("avi", "视频.avi"); // Unsupported media type
    }
}

6、结果展示:

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

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

相关文章

鸿蒙面试心得

自疫情过后,java和web前端都进入了冰河时代。年龄、薪资、学历都成了找工作路上躲不开的门槛。 年龄太大pass 薪资要高了pass 学历大专pass 好多好多pass 找工作的路上明明阳关普照,却有一种凄凄惨惨戚戚说不清道不明的“优雅”意境。 如何破局&am…

不用翻墙,手把手教你用MAC本地版免费ComfyUI搭建Stable Diffusion工作流,让出图效率起飞

AI绘图如火如荼发展了这么久,从mj到SD webUI,再到时下最热门的Comfy UI。因为显存的问题对Mac用户一直不是很友好,阻碍了大部分设计师上手学习的道路。但是Comflowy解决了这个痛点。这是一款Mac系统可用本地版的sd,一键安装,让苹果…

【Sklearn驯化-聚类指标】搞懂机器学习中聚类算法评估指标,轮廓系数、戴维森堡丁指数

【Sklearn驯化-聚类指标】搞懂机器学习中聚类算法评估指标,轮廓系数、戴维森堡丁指数 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! &#…

OnlyOffice测评

官方链接: https://www.onlyoffice.com/zh/office-suite.aspx https://www.onlyoffice.com/zh/pdf-editor.aspx OnlyOffice:引领办公效率的新标杆 在数字化时代的浪潮中,办公软件已经成为我们日常工作中不可或缺的一部分。然而,…

马斯克的SpaceX星舰有多牛?我们离殖民火星还有多远?

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 埃隆马斯克是一位知名的企业家和工程师,他掌握着多家公司,涉及多个领域,包括电动汽车、太空探索、太阳能、脑…

入门JavaWeb之 Response 下载文件

web 服务器接收到客户端的 http 请求 针对这个请求,分别创建一个代表请求的 HttpServletRequest 对象,代表响应的 HttpServletResponse 对象 获取客户端请求过来的参数:HttpServletRequest 给客户端响应一些信息:HttpServletRe…

【LeetCode】五、哈希表相关:统计重复元素 + 找不同

文章目录 1、哈希表结构2、Java中的哈希表3、leetcode217:统计重复元素4、leetcode389:找不同5、leetcode496:下一个更大元素 1、哈希表结构 又叫散列表,存键值对,将key用哈希函数转为数组下标索引 当两个不同的key经…

多功能气象传感器的工作原理

TH-WQX9多功能气象传感器是一种集成了多种传感器技术的气象观测装置,旨在同时测量和监测大气中的多个气象要素,以提供全面、准确的气象信息。以下是关于多功能气象传感器的详细介绍: 技术原理 多功能气象传感器采用多种传感器技术相结合&…

[C++][设计模式][原型模式]详细讲解

1.动机 在软件系统中,经常面临这“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出…

【FFmpeg】avformat_alloc_output_context2函数

【FFmpeg】avformat_alloc_output_context2函数 1.avformat_alloc_output_context21.1 初始化AVFormatContext(avformat_alloc_context)1.2 格式猜测(av_guess_format)1.2.1 遍历可用的fmt(av_muxer_iterate&#xff0…

正版软件 | DupInOut Duplicate Finder:智能清理,让数据井然有序

在信息爆炸的时代,我们经常面临数据管理的挑战。DupInOut Duplicate Finder 是一款专为Windows 设计的重复文件查找工具,帮您快速识别并删除重复的文档、音乐、视频和照片,让您的计算环境更加清洁、有序。 精准查找,一键删除 DupI…

DM达梦数据库转换、条件函数整理

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

硬件开发笔记(二十二):AD21软件中创建元器件AXK5F80337YG原理图库、封装库和3D模型

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140007117 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

怎么扫描图片变成pdf格式?办公人士值得收藏的宝藏工具

将图片扫描并转换为PDF格式可以通过多种途径实现,无论是使用专业的扫描仪还是智能手机,都有相应的方法。 PDF 是什么? PDF,全称为 Portable Document Format(便携式文档格式),是由Adobe System…

使用宝塔安装ModstartCMS (非一键安装)

操作系统 Linux Windows 推荐 Linux 操作系统,性能比较好 软件环境 稳定版 PHP 5.6 PHP 7.0 MySQL >5.0 PHP Extension:Fileinfo Apache/Nginx Laravel 9.0 版本 PHP 8.1 MySQL >5.0 PHP Extension:Fileinfo Apache/Ngin…

DLS策略洞察:如何应对AI数据中心网络交换机市场的爆发式增长?

摘要: 随着AI技术的发展和应用,AI数据中心对网络交换机的需求日益增加。摩根士丹利预计,2023-2026年间,AI数据中心网络交换机的收入复合年增长率(CAGR)将达到55%。本文将详细分析AI数据中心网络交换机市场…

Springboot + Mybatis-Plus代码生成指南

使用 Spring Boot 和 MyBatis-Plus 生成代码&#xff0c;可以大大简化开发流程&#xff0c;可以保持编码的规范性&#xff0c;生成单元测试等。以下是详细步骤&#xff1a; 配置pom.xml <dependency><groupId>com.baomidou</groupId><artifactId>myb…

Arcgis 计算经纬度坐标并补齐6位小数

工作中我们经常需要在Arcgis中计算点的经纬度或者线的起点、终点坐标&#xff0c;为确保数据的准确性&#xff0c;我们必须保留6位小数&#xff0c;但我们在默认计算的时候偶尔会遇到算出来的经纬度坐标小数位不足6位&#xff0c;那我们应该如何补齐呢&#xff0c;这里我将方法…

如何不改变 PostgreSQL 列类型#PG培训

开发应用程序并在其背后操作数据库集群时&#xff0c;会遇到一个意想不到的问题是实践与理论、开发环境与生产之间的差异。这种不匹配的一个完美例子就是更改列类型。 #PG考试#postgresql培训#postgresql考试#postgresql认证 关于如何在 PostgreSQL&#xff08;以及其他符合 SQ…

Hugo Barra对Apple Vision Pro 硬件和软件的详细评述

原文&#xff1a;hugo.blog/2024/03/11/vision-pro 这篇文章的作者是Hugo Barra。Hugo Barra曾是Meta公司&#xff08;前身为Facebook&#xff09;旗下Oculus VR/AR团队的负责人。他在2017年至2020年期间领导了Oculus的团队&#xff0c;参与了多个VR头显的开发和发布。Hugo Bar…