为什么我需要使用责任链,如果我可以将所有命令加载到某个容器中,然后一个一个地执行命令。这将使处理请求的链连续。顺便说一句,我觉得它比 CoR 更好,因为您可以在运行时删除某些特定命令或替换为另一个命令,而对于 CoR,您需要创建另一个链来更改链中的某些内容,因为您无法访问其中的元素除了第一个元素的链。 (实际上,它是一个单链表。)
最佳答案
只是为了“保持简单愚蠢”:-)
当你特别需要它时创建一个队列/堆栈,你会知道什么时候需要它,不是吗?
例如 - 如果您必须进行一些简单的数据操作,例如:
data.clean().format().save();
对比
commands.push(new Cleaner(data));
commands.push(new Formatter(data));
commands.push(new Updates(data));
commands.execute();
还要注意,我必须编写更多代码来创建新的数据结构(命令堆栈)。
但是可以说这是更具战略意义的东西,比如说射击游戏。玩家可以被射杀、杀死等,结果取决于选择的游戏难度级别。
headShot = new Command();
headShot.push(new FreezePlayer());
headShot.push(new BleedPlayer());
headShot.push(new KillPlayer());
bodyShot = new Command();
headShot.push(new FreezePlayer());
headShot.push(new BleedPlayer());
headShot.push(new LooseHealth());
player.onHit = function(hitPoint){
hitPoint.aboveNeck() ? headShot.on(this) : bodyShot.on(this);
};
请注意,在这种情况下,我们必须创建一个可以传递并在运行时发生的策略。
所以在简单模式下,bodyShot 可能没有最后一个元素 (LooseHealth),headShot 可能有 LooseHealth 而不是 KillPlayer 作为最后一个元素。
希望能帮助到你。
关于design-patterns - 责任链与队列或堆栈中的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32496782/