把书读薄 | 《设计模式之美》设计模式与范式(行为型-命令模式)(上)

简介: 本文对应设计模式与范式:行为型(71),命令模式 (Command Pattern),同样是工作中不怎么常用的模式,了解下即可~

0x1、定义


原始定义


将一个请求(命令)封装成一个对象,从而让我们可以使用 不同的请求参数化其他对象(依赖注入),且支持请求的排队执行、记录日志、撤销等功能(附加控制)。


落实到编码实现,命令模式用的最核心的实现手段就是:将函数封装成对象以便传递,当你所用的编程语言不支持函数作为参数传递,就可以考虑用下它了。把函数封装成对象,还可以存储控制执行,这也是命令模式的优点~


0x2、写个简单例子


用命令模式写个音乐播放控制的例子吧,先是业务实体:


public class Music {
    private String name;
    private String url;
    public Music(String name, String url) {
        this.name = name;
        this.url = url;
    }
    public String getName() { return name; }
    public String getUrl() { return url; }
}


接着到 抽象命令类 → 声明要做的操作:


public interface ICommand {
    void execute();
}


再接着到 抽象接收者 → 声明要执行的命令,同时提供给客户端使用:


public interface IPlayer {
    void setPlayList(List<Music> musics);
    void play();
    void play(int cursor);
    void next();
    void pre();
    void pause();
}


紧接着到 具体命令类 → 实现抽象命令类,存储一个接收者,执行调用具体命令时,委托给接收者执行具体方法:


public class SetPlayListCommand implements ICommand {
    private final IPlayer player;
    private List<Music> musics;
    public SetPlayListCommand(IPlayer player) { this.player = player; }
    @Override public void execute() { player.setPlayList(musics); }
    public void setPlayList(List<Music> musics) { this.musics = musics; }
}
public class PlayCommand implements ICommand {
    private final IPlayer player;
    public PlayCommand(IPlayer player) { this.player = player; }
    @Override public void execute() { player.play(); }
}
public class NextCommand implements ICommand {
    private final IPlayer player;
    public NextCommand(IPlayer player) { this.player = player; }
    @Override public void execute() { player.next(); }
}
// 剩余两个命令类似,调用不同的player方法而已...


再接着到 具体接收者 → 实现抽象接收者,接收命令并执行真实代码逻辑:


public class MusicPlayer implements IPlayer {
    private int cursor = -10000; // 当前播放游标
    private int pauseCursor = -10000; // 当前暂停游标
    private final List<Music> musics = new ArrayList<>();
    @Override
    public void setPlayList(List<Music> musics) {
        this.musics.clear();
        if(musics == null || musics.isEmpty()) {
            System.out.println("设置播放列表不能为空!");
        } else {
            this.musics.addAll(musics);
            this.cursor = -10000;
            System.out.println("列表设置成功,当前曲目:");
            for(Music music: this.musics) {
                System.out.println("【" + music.getName() +"】");
            }
        }
    }
    @Override
    public void play() {
        if(musics.size() == 0) {
            System.out.println("当前播放列表为空,请先设置播放列表");
        } else {
            if(cursor == -10000) {
                cursor = 0;
                System.out.println("开始播放:" + musics.get(0).getName());
            } else {
                if(cursor < musics.size()) {
                    if(cursor == pauseCursor) {
                        System.out.println("继续播放:" + musics.get(cursor).getName());
                        pauseCursor = -10000;
                    } else {
                        if(cursor < 0) {
                            cursor = musics.size() - 1;
                        }
                        System.out.println("开始播放:" + musics.get(cursor).getName());
                    }
                } else {
                    System.out.println("播放列表歌曲已经播放完毕,重头开始播放");
                    cursor = 0;
                    System.out.println("开始播放:" + musics.get(0).getName());
                }
            }
        }
    }
    @Override
    public void next() {
        cursor++;
        play();
    }
    @Override
    public void pre() {
        cursor--;
        play();
    }
    @Override
    public void pause() {
        pauseCursor = cursor;
        System.out.println("暂停播放");
    }
}


相关文章
|
2月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
3月前
|
设计模式 存储 Java
【十二】设计模式~~~行为型模式~~~命令模式(Java)
文章详细介绍了命令模式(Command Pattern),这是一种对象行为型模式,用于将请求封装成对象,实现请求发送者与接收者的解耦,从而降低系统耦合度、提高灵活性,并支持命令的排队、记录、撤销和恢复操作。通过案例分析、结构图、时序图和代码示例,文章展示了命令模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
|
4月前
|
设计模式 JavaScript API
js设计模式【详解】—— 命令模式
js设计模式【详解】—— 命令模式
44 6
|
5月前
|
设计模式
命令模式-大话设计模式
命令模式-大话设计模式
|
5月前
|
设计模式 算法
行为型设计模式之模板模式
行为型设计模式之模板模式
|
5月前
|
设计模式 Java uml
必知的技术知识:JAVA【设计模式】命令模式
必知的技术知识:JAVA【设计模式】命令模式
28 0
|
5月前
|
设计模式 Java
Java设计模式之命令模式详解
Java设计模式之命令模式详解
|
5月前
|
设计模式
设计模式之命令模式
设计模式之命令模式
|
5月前
|
设计模式 存储
行为型设计模式之观察者模式
行为型设计模式之观察者模式
|
5月前
|
设计模式 算法
行为型设计模式
行为型设计模式