Bootstrap

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

问题描述

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

设计分析

状态模式

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

策略模式

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

装饰模式

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

流程图

播放
暂停
播放
停止
播放

模块依赖关系图

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
;