命令模式,从人机对战的五子棋开始

749 阅读1分钟

命令者模式,指的是执行主体可以执行某些特定事件,并且,支持队列等待、调起执行和事件撤销等行为。

假如有个五子棋的场景,黑棋是真人,白棋是电脑,黑棋先落子,可以悔棋。

我们先来定义一个执行者主体类:

class CommandSubject {
    constructor(name) {
        // 命令执行者
        this.executer = name;
        // 命令所在位置的列表
        this.posList = []
        // 演算步骤
        this.computedStep = []
    }

    // 命令执行函数
    execute(pos /*落子位置*/ ) {
        // 执行命令
        console.log(`棋子落在了[${pos[0]}, ${pos[1]}]的位置`)
        // 记录位置
        this.posList.push(pos)
    }
    // 撤回操作
    undo(step /* 撤回步数*/ ) {
        // 撤回命令
        for (let i = 0; i < step; i++) {
            // 撤回的位置
            const pos = this.posList.pop();
            console.log()
            // 撤回的操作
            console.log(`撤回[${pos[0]}, ${pos[1]}]位置的棋子`)
        }
    }
    // 执行演算步骤
    executeComputedCommand() {
        // 请自行实现吆
    }

}

我们new一个黑棋执行者。

var blackSubject = new CommandSubject('黑棋执行者');

假如黑棋执行者,和电脑共对弈 4 步。

blackSubject.execute([3, 4])
blackSubject.execute([4, 2])
blackSubject.execute([5, 3])
blackSubject.execute([5, 4])
console.log(blackSubject.posList)

此时的局势如图:

image.png

黑棋执行者觉得下错了,想悔棋 2 步。

blackSubject.undo(2)

此时的局势如图:

image.png

下棋时可能我们还会想一下接下来会走那几步,涉及到演算,假如我们演算了 3 步,那么这 3 步不是一下就落子的,而是等白棋落子后,黑棋执行者才能落子,这就是命令执行的队列问题。请自行实现吆~

如果感兴趣,也可以再new一个白棋执行者,互动下棋吆~

写在最后

如果觉得本文对理解命令模式有帮助,请点赞支持一下吆,你的点赞是我持续思考和分享的动力吆~