【问题标题】:Chain of Responsibility vs Commands in a queue or stack队列或堆栈中的责任链与命令
【发布时间】:2015-09-10 08:27:58
【问题描述】:

为什么我需要使用责任链,如果我可以将所有命令加载到某个容器中并一一执行命令。这将连续处理一个请求。顺便说一句,我觉得它比 CoR 更好,因为您可以在运行时删除一些特定命令或替换为另一个命令,而对于 CoR,您需要创建另一个链来更改链中的某些内容,因为您无法访问链除了第一个元素。 (实际上,它是一个单链表。)

【问题讨论】:

标签: design-patterns containers command-pattern chain-of-responsibility


【解决方案1】:

只是为了“保持简单傻”:-)

当你特别需要时创建一个队列/堆栈,你会知道什么时候需要它,不是吗?

例如-如果您必须进行一些简单的数据操作,例如:

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 作为最后一个元素。

希望对你有帮助。

【讨论】:

  • 哪个简单? COR还是堆栈?对我来说,两者都是一样的。
  • 您已将堆栈与静态data.clean().format().save(); 进行了比较。但我问的是堆栈与 COR,因为两者都可以进行运行时更改,就像在 COR 中你可以创建新链一样。
猜你喜欢
  • 2021-03-17
  • 1970-01-01
  • 2015-11-16
  • 2019-03-07
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多