设计模式(七):适配器模式

设计模式(七):适配器模式

  • [1. 适配器模式的介绍](#1. 适配器模式的介绍)
  • [2. 适配器模式的类图](#2. 适配器模式的类图)
  • [3. 适配器模式的实现](#3. 适配器模式的实现)
    • [3.1 创建媒体播放器和高级媒体播放器接口](#3.1 创建媒体播放器和高级媒体播放器接口)
    • [3.2 创建具体播放器](#3.2 创建具体播放器)
    • [3.3 创建媒体适配器](#3.3 创建媒体适配器)
    • [3.4 测试](#3.4 测试)

1. 适配器模式的介绍

适配器模式(Adapter Pattern)属于结构型模式,是作为两个不兼容的接口之间的桥梁。这种类型的设计模式它结合了两个独立接口的功能。

主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。适配器继承或依赖已有的对象,实现想要的目标接口。

2. 适配器模式的类图

一个MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。AudioPlayer 只可以播放 mp3 格式的音频文件。

另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。它们可以播放 wav和alac 格式的音频文件。

如果想要让 AudioPlayer 播放wav和alac 格式的音频文件,需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。

AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。

3. 适配器模式的实现

3.1 创建媒体播放器和高级媒体播放器接口

java 复制代码
package blog;

/**
 * 媒体播放器
 */
public interface MediaPlayer {
    void play(String type, String file);
}
java 复制代码
package blog;

/**
 * 高级媒体播放器
 */
public interface AdvancedMediaPlayer {
    void playWav(String file);

    void playAlac(String file);
}

3.2 创建具体播放器

java 复制代码
package blog;

/**
 * 音频播放器
 */
public class AudioPlayer implements MediaPlayer{
    private MediaAdapter mediaAdapter;

    @Override
    public void play(String type, String file) {
        if ("mp3".equals(type)) {
            System.out.println("播放mp3格式的音频文件:" + file);
            return;
        }

        if ("wav".equals(type) || "alac".equals(type)) {
            mediaAdapter = new MediaAdapter(type);
            mediaAdapter.play(type, file);
            return;
        }

        System.out.println("播放器不支持"+ type +"格式的文件");

    }
}
java 复制代码
package blog;

/**
 * wav格式播放器
 */
public class WavPlayer implements AdvancedMediaPlayer{
    @Override
    public void playWav(String file) {
        System.out.println("播放wav格式的音频文件:" + file);
    }

    @Override
    public void playAlac(String file) {

    }
}
java 复制代码
package blog;

/**
 * alac格式播放器
 */
public class AlacPlayer implements AdvancedMediaPlayer{
    @Override
    public void playWav(String file) {

    }

    @Override
    public void playAlac(String file) {
        System.out.println("播放alac格式的音频文件:" + file);
    }
}

3.3 创建媒体适配器

java 复制代码
package blog;

/**
 * 媒体适配器
 */
public class MediaAdapter implements MediaPlayer{
    private AdvancedMediaPlayer advancedMediaPlayer;

    public MediaAdapter(String type) {
        if ("wav".equals(type)) {
            advancedMediaPlayer = new WavPlayer();
        }

        if ("alac".equals(type)) {
            advancedMediaPlayer = new AlacPlayer();
        }
    }

    @Override
    public void play(String type, String file) {
        if ("wav".equals(type)) {
            advancedMediaPlayer.playWav(file);
        }

        if ("alac".equals(type)) {
            advancedMediaPlayer.playAlac(file);
        }
    }
}

3.4 测试

java 复制代码
package blog;

public class AdapterDemo {
    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();
        audioPlayer.play("mp3", "阳光男孩");
        audioPlayer.play("wav", "你的背包");
        audioPlayer.play("alac", "一千年以后");
        audioPlayer.play("ape", "后会无期");
    }
}
相关推荐
要开心吖ZSH1 小时前
定时任务是用外部调度(xxl-job)还是本地化( @Scheduled)更香?以号源刷新任务为例?
java·xxl-job·定时任务·scheduled
nagualky1231 小时前
GPT-4 系列退役在即:一套可回滚的模型迁移验收法
java·开发语言·ai·架构
今天的砖头有点烫手啊1 小时前
Java 8 Stream 原理拆解:惰性求值与并行流陷阱
java·jvm
starzy19901 小时前
Flink 任务调度 Graph 源码深度剖析:从 StreamGraph 到 ExecutionGraph 的三层演进
java·大数据·flink
Eyfcom1 小时前
〖实战〗快运系统 Oracle 性能优化:从“能用”到“扛住双11”的 Java + Spring Boot 实战
java·oracle·性能优化·快递管理系统
geovindu1 小时前
rust: Chain of Responsibility Pattern
开发语言·后端·设计模式·rust·责任链模式·行为模式
m0_587383001 小时前
碰碰好评卡功能落地全流程实战指南 附核心逻辑与常见问题解决方案
java·前端·数据库·后端·struts·需求分析
cheems95271 小时前
从统一响应到 Swagger:一篇讲清微服务接口文档设计未命名
java·微服务·架构·状态模式
Y3815326621 小时前
SerpBase + RAG 实战:用搜索 API 给知识库接上实时数据,回答不再过期
java·服务器·数据库
开开心心就好1 小时前
文件关联被破坏怎么修?免费工具一键修复
java·服务器·开发语言·pdf·ocr·启发式算法·宽度优先