首页 > 编程笔记 > Java笔记

使用命令模式实现播放器功能

我们平时使用的视频播放器都会有播放控制条,主要用来播放、拖动进度、停止播放和暂停等。我们在操作播放器的时候并不是直接调用播放器的方法,而是通过一个控制条去传达指令给播放器内核。具体传达的指令会被封装为一个个按钮,每个按钮就相当于对一条命令的封装。而用控制条也实现了用户发送指令与播放器内核接收指令的解耦。

下面来看具体实现代码,首先创建播放器内核 VideoPlayer类。
public class VideoPlayer{
    public void play() {
        System.out.println("正常播放");
    }

    public void speed() {
        System.out.println("拖动进度条");
    }

    public void stop() {
        System.out.println("停止播放");
    }

    public void pause() {
        System.out.println("暂停播放");
    }
}
创建命令接口 Command 类。
public interface Command {
    void execute();
}
然后分别创建操作播放器可以接收的指令,播放指令 PlayCommand 类的代码如下。
public class PlayCommand implements Command {
    private VideoPlayer videoPlayer;

    public PlayCommand(VideoPlayer videoPlayer ) {
        this.videoPlayer = videoPlayer ;
    }

    @Override
    public void execute() {
        videoPlayer.play();
    }
}
暂停指令 PauseCommand 类的代码如下。
public class PauseCommand implements Command {
    private VideoPlayer videoPlayer;

    public PauseCommand(VideoPlayer videoPlayer) {
        this.videoPlayer = videoPlayer;
    }

    @Override
    public void execute() {
         videoPlayer.pause();
    }
}
拖动进度条指令 SpeedCommand 类的代码如下。
public class SpeedCommand implements Command {
    private VideoPlayer videoPlayer;

    public SpeedCommand(VideoPlayer videoPlayer) {
        this.VideoPlayer=  videoPlayer;
    }

    @Override
    public void execute() {
         videoPlayer.speed();
    }
}
停止播放指令 StopCommand 类的代码如下。
public class StopCommand implements Command {
    private VideoPlayer videoPlayer;

    public StopCommand(VideoPlayer videoPlayer) {
        this.videoPlayer=  videoPlayer;
    }

    @Override
    public void execute() {
         videoPlayer.stop();
    }
}
最后创建控制条 Controller 类。
public class Controller {
    private List<Command> Commands = new ArrayList<Command>();

    public void addCommand(Command Command) {
        Commands.add(Command);
    }

    public void execute(Command Command) {
        Command.execute();
    }

    public void executes() {
        for (Command Command : Commands) {
            Command.execute();
        }
        Commands.clear();
    }
}
从上面代码来看,控制条可以执行单条命令,也可以批量执行多条命令。下面来看客户端测试代码。
public class Test {
    public static void main(String[] args) {

        VideoPlayer player = new videoPlayer();
        Controller controller = new Controller();
        controller.execute(new PlayCommand(player));

        controller.addCommand(new PauseCommand(player));
        controller.addCommand(new PlayCommand(player));
        controller.addCommand(new StopCommand(player));
        controller.addCommand(new SpeedCommand(player));
        controller.executes();
    }
}
执行结果如下。

正常播放
暂停播放
正常播放
停止播放
拖动进度条

显然控制条已经与播放器内核解耦了,如果想扩展新命令,只需在此基础上增加命令即可,控制条的结构无需改动。

所有教程

优秀文章