design-patterns - 责任链与队列或堆栈中的命令

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

为什么我需要使用责任链,如果我可以将所有命令加载到某个容器中,然后一个一个地执行命令。这将使处理请求的链连续。顺便说一句,我觉得它比 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/

相关文章:

docker - 卷并未真正安装到 IBM Bluemix 上的 docker 容器

c++ - C++ 中的容器 : pointers vs references

c++ - 预览Command模式效果的设计模式

c# - 在 C# 中返回具有泛型约束的 Task<T> 的异步方法

c# - Windows Presentation Foundation(WPF)项目不支持AppCommand

R:如何选择目录中同时满足名称开头和结尾条件的文件?

Azure IoT Edge 部署文件已更新但已删除 docker 容器仍保持运行

php - _beforeFoo 回调设计模式的更好/正式名称

c# - 在不修改类(或了解实现细节)的情况下扩展类的模式 (c#)

database - 使用数据库的设计模式