命令者模式,指的是执行主体可以执行某些特定事件,并且,支持队列等待、调起执行和事件撤销等行为。
假如有个五子棋的场景,黑棋是真人,白棋是电脑,黑棋先落子,可以悔棋。
我们先来定义一个执行者主体类:
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)
此时的局势如图:
黑棋执行者觉得下错了,想悔棋 2 步。
blackSubject.undo(2)
此时的局势如图:
下棋时可能我们还会想一下接下来会走那几步,涉及到演算,假如我们演算了 3 步,那么这 3 步不是一下就落子的,而是等白棋落子后,黑棋执行者才能落子,这就是命令执行的队列问题。请自行实现吆~
如果感兴趣,也可以再new一个白棋执行者,互动下棋吆~
写在最后
如果觉得本文对理解命令模式有帮助,请点赞支持一下吆,你的点赞是我持续思考和分享的动力吆~