问题描述
设计一个媒体播放器系统,用户可以播放、暂停、停止和切换媒体。系统需要支持多种媒体格式(如音频和视频),并允许在播放过程中应用不同的效果(如音量调节、均衡器等)。
设计分析
状态模式
状态模式允许对象在其内部状态改变时改变其行为。媒体播放器需要在不同状态下(播放、暂停、停止)执行不同的操作,使用状态模式可以使状态转换更加灵活。
策略模式
策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。媒体播放器需要支持多种媒体格式的播放,使用策略模式可以使播放策略更加灵活,方便添加新的媒体格式而不影响现有代码。
装饰模式
装饰模式动态地将责任附加到对象上。媒体播放器需要在播放过程中应用不同的效果,使用装饰模式可以使效果的应用更加灵活,方便组合和扩展。
流程图
模块依赖关系图
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