问题描述
设计一个媒体播放器系统,用户可以播放、暂停、停止和切换媒体。系统需要支持多种媒体格式(如音频和视频),并允许在播放过程中应用不同的效果(如音量调节、均衡器等)。
设计分析
状态模式
状态模式允许对象在其内部状态改变时改变其行为。媒体播放器需要在不同状态下(播放、暂停、停止)执行不同的操作,使用状态模式可以使状态转换更加灵活。
策略模式
策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。媒体播放器需要支持多种媒体格式的播放,使用策略模式可以使播放策略更加灵活,方便添加新的媒体格式而不影响现有代码。
装饰模式
装饰模式动态地将责任附加到对象上。媒体播放器需要在播放过程中应用不同的效果,使用装饰模式可以使效果的应用更加灵活,方便组合和扩展。
流程图
模块依赖关系图
graph TDMediaPlayer --> StateState <|-- PlayingStateState <|-- PausedStateState <|-- StoppedStateMediaPlayer --> StrategyStrategy <|-- AudioStrategyStrategy <|-- VideoStrategyMediaPlayer --> EffectEffect <|-- VolumeEffectEffect <|-- EqualizerEffect
详细设计与实现
状态模式(播放状态)
// 状态接口
interface State {void play();void pause();void stop();
}// 播放状态
class PlayingState implements State {private MediaPlayer player;public PlayingState(MediaPlayer player) {this.player = player;}@Overridepublic void play() {System.out.println("Already playing.");}@Overridepublic void pause() {System.out.println("Pausing playback.");player.setState(player.getPausedState());}@Overridepublic 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;}@Overridepublic void play() {System.out.println("Resuming playback.");player.setState(player.getPlayingState());}@Overridepublic void pause() {System.out.println("Already paused.");}@Overridepublic 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;}@Overridepublic void play() {System.out.println("Starting playback.");player.setState(player.getPlayingState());}@Overridepublic void pause() {System.out.println("Can't pause. Playback is stopped.");}@Overridepublic void stop() {System.out.println("Already stopped.");}
}
策略模式(播放策略)
// 策略接口
interface PlayStrategy {void play();
}// 音频播放策略
class AudioStrategy implements PlayStrategy {@Overridepublic void play() {System.out.println("Playing audio.");}
}// 视频播放策略
class VideoStrategy implements PlayStrategy {@Overridepublic void play() {System.out