适配器模式

定义:你可以将一个不兼容的对象包装在一个适配器中,从而使其与另一个类兼容。在软件工程中,适配器模式是一种结构型设计模式,它允许现有类的接口被用作另一个接口。它通常用于让现有类与其他类协同工作,而无需修改它们的源代码。

适用场景:

当你希望复用一些现有的类,但是他们的接口与当前系统不兼容时,可以使用适配器模式。适配器模式可以帮助你将一个类的接口转换成另一个类的接口,从而使的原本接口不兼容的类可以一起工作。

AdvancedMediaPlayer.java 高级媒体播放器接口

java 复制代码
package adapter;

/**
 * @Created: 2024-10-11 16:45
 * @Description: 高级媒体播放器接口
 */
public interface AdvancedMediaPlayer {

    void playVlc(String fileName);

    void playAvi(String fileName);
}

VlcPlayer.java Vlc播放器

java 复制代码
package adapter;

/**
 * @Created: 2024-10-11 16:46
 * @Description: Vlc播放器
 */
public class VlcPlayer implements AdvancedMediaPlayer{

    @Override
    public void playVlc(String fileName) {
        System.out.println("playVlc");
    }

    @Override
    public void playAvi(String fileName) {
        //什么也不做
    }
}

AviPlayer.java Avi播放器

java 复制代码
package adapter;

/**
 * @Created: 2024-10-11 16:47
 * @Description: Avi播放器
 */
public class AviPlayer implements AdvancedMediaPlayer{
    @Override
    public void playVlc(String fileName) {
        //什么也不做
    }

    @Override
    public void playAvi(String fileName) {
        System.out.println("play Avi");
    }
}
复制代码
MediaAdapter.java 适配器类
java 复制代码
package adapter;

/**
 * @Created: 2024-10-11 16:49
 * @Description: 适配器类
 */
public class MediaAdapter implements MediaPlayer {

    AdvancedMediaPlayer vlcPlayer = new VlcPlayer();
    AdvancedMediaPlayer aviPlayer = new AviPlayer();

    @Override
    public void play(String videoType, String fileName) {
        if (videoType.equalsIgnoreCase("vlc")) {
            vlcPlayer.playVlc(fileName);
        } else if (videoType.equalsIgnoreCase("avi")) {
            aviPlayer.playVlc(fileName);
        }
    }
}

MediaPlayer.java 媒体播放接口

java 复制代码
package adapter;

/**
 * @Created: 2024-10-11 16:42
 * @Description: 媒体播放器接口
 */
public interface MediaPlayer {
    void play(String videoType, String fileName);
}

VideoPlayer.java 视频播放器

java 复制代码
package adapter;

/**
 * @Created: 2024-10-11 16:53
 * @Description: 视频播放器
 */
public class VideoPlayer implements MediaPlayer {
    MediaPlayer mediaPlayer = new MediaAdapter();

    @Override
    public void play(String videoType, String fileName) {
        if (videoType.equalsIgnoreCase("mp4")) {
            System.out.println("播放视频播放器类");
        } else if (videoType.equalsIgnoreCase("vlc") || videoType.equalsIgnoreCase("avi")) {
            mediaPlayer.play(videoType, fileName);
        } else {
            System.out.println("not support");
        }
    }
}

代码逻辑:原本项目程序有播放器MediaPalyer只有一个play方法,且只能播放mp4类的视频格式,但是现在要支持播放vlc和avi格式的高级的视频格式,于是开始开发代码,不动原来的代码

定义一个新的接口AdvancedMediaPlayer,实现类为 VlcPlayer和AviPlayer支持高级格式视频播放,定义一个MediaAdapter适配器类,实现了MedaiPlayer接口,并将请求转发给AdvancedMediaPlayer对象,通过引入MediaAdapter这个中间转发层,就可以原本不支持播放高级视频的播放器,支持高级格式的视频播放;最后VideoPlayer即能播放mp4 ,有能使用MediaAdapter适配器类播放vlc和avi格式;

适配器设计模式通过创建一个中间层,使得两个不兼容的接口可以协同工作。在实际开发中,适配器模式可以帮助我们复用已有代码,提高系统的灵活性和可维护性。

参考B站视频:

适配器(Adapter)设计模式_哔哩哔哩_bilibili

相关推荐
kiracrimson10 小时前
栈与队列容器:适配器、deque 与 priority_queue
开发语言·c++·适配器模式
傲世仙尊2 天前
stack-queue与deque-适配器模式中控数组分段连续与仿函数
适配器模式
Eyfcom3 天前
〖物流系统架构演进实录 02〗物流网关设计:多平台接入适配与异构接口的统一收敛
适配器模式·物流管理系统·物流架构·网关设计·多平台对接
yuehuaxin0113 天前
LS8011C 快充协议芯片|SOT‑23‑6L 内置 431,PD3.2 SPR/PPS 适配器物料备选评估调试笔记
笔记·智能家居·适配器模式·智能硬件
yuehuaxin0113 天前
LP3717BSL 芯茂微|SOP8L 自供电 PSR,SEL 电阻调峰值电流,12W 充电器物料替代评估笔记
嵌入式硬件·适配器模式·智能硬件
缓慢更新13 天前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
博风15 天前
8、设计模式应用举例:适配器模式:Iterator接口与Enumeration接口
设计模式·适配器模式
范中勤19 天前
适配器模式(Adapter Pattern):原理、场景与 LLM 多厂商工程落地
设计模式·架构·langchain·适配器模式·多厂商
yuehuaxin0119 天前
上海贝岭 BL6523GX(D78) 单相计量芯片开发笔记:引脚定义、寄存器配置与校表流程
嵌入式硬件·智能家居·适配器模式·智能硬件
yuehuaxin0124 天前
LP20R100FN 同步整流|3C 认证适配器 CCM 工况倒灌、温升超标样机避坑解析
嵌入式硬件·智能家居·适配器模式·智能硬件