设计模式实战:媒体播放器的设计与实现

问题描述

设计一个媒体播放器系统,用户可以播放、暂停、停止和切换媒体。系统需要支持多种媒体格式(如音频和视频),并允许在播放过程中应用不同的效果(如音量调节、均衡器等)。

设计分析

状态模式

状态模式允许对象在其内部状态改变时改变其行为。媒体播放器需要在不同状态下(播放、暂停、停止)执行不同的操作,使用状态模式可以使状态转换更加灵活。

策略模式

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。媒体播放器需要支持多种媒体格式的播放,使用策略模式可以使播放策略更加灵活,方便添加新的媒体格式而不影响现有代码。

装饰模式

装饰模式动态地将责任附加到对象上。媒体播放器需要在播放过程中应用不同的效果,使用装饰模式可以使效果的应用更加灵活,方便组合和扩展。

流程图

播放
暂停
播放
停止
播放

模块依赖关系图

graph TD
    MediaPlayer --> State
    State <|-- PlayingState
    State <|-- PausedState
    State <|-- StoppedState
    MediaPlayer --> Strategy
    Strategy <|-- AudioStrategy
    Strategy <|-- VideoStrategy
    MediaPlayer --> Effect
    Effect <|-- VolumeEffect
    Effect <|-- EqualizerEffect

详细设计与实现

状态模式(播放状态)

// 状态接口
interface State {
   
    void play();
    void pause();
    void stop();
}

// 播放状态
class PlayingState implements State {
   
    private MediaPlayer player;

    public PlayingState(MediaPlayer player) {
   
        this.player = player;
    }

    @Override
    public void play() {
   
        System.out.println("Already playing.");
    }

    @Override
    public void pause() {
   
        System.out.println("Pausing playback.");
        player.setState(player.getPausedState());
    }

    @Override
    public void stop() {
   
        System.out.println("Stopping playback.");
        player.setState(player.getStoppedState());
    }
}

// 暂停状态
class PausedState implements State {
   
    private MediaPlayer player;

    public PausedState(MediaPlayer player) {
   
        this.player = player;
    }

    @Override
    public void play() {
   
        System.out.println("Resuming playback.");
        player.setState(player.getPlayingState());
    }

    @Override
    public void pause() {
   
        System.out.println("Already paused.");
    }

    @Override
    public void stop() {
   
        System.out.println("Stopping playback.");
        player.setState(player.getStoppedState());
    }
}

// 停止状态
class StoppedState implements State {
   
    private MediaPlayer player;

    public StoppedState(MediaPlayer player) {
   
        this.player = player;
    }

    @Override
    public void play() {
   
        System.out.println("Starting playback.");
        player.setState(player.getPlayingState());
    }

    @Override
    public void pause() {
   
        System.out.println("Can't pause. Playback is stopped.");
    }

    @Override
    public void stop() {
   
        System.out.println("Already stopped.");
    }
}

策略模式(播放策略)

// 策略接口
interface PlayStrategy {
   
    void play();
}

// 音频播放策略
class AudioStrategy implements PlayStrategy {
   
    @Override
    public void play() {
   
        System.out.println("Playing audio.");
    }
}

// 视频播放策略
class VideoStrategy implements PlayStrategy {
   
    @Override
    public void play() {
   
        System.out
  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捕风捉你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值