【问题标题】:In what cases the Chain of Command design pattern is applicable?命令链设计模式适用于哪些情况?
【发布时间】:2012-10-03 09:07:03
【问题描述】:

请有人用这些模式清理我脑海中的混乱:

  • 指挥链
  • 责任链

我见过两者相同的网站(命令链示例与责任链相同),而其他网站则不同。

这是我对每个的理解:

指挥链:

我们称它为 CommandChain 的类,其属性包含一个“命令”列表,这些命令是实现相同接口的类的实例。假设他们都必须实现 onCommand(command, arguments)。

CommandChain 具有在其中注册新命令的 addCommand() 方法,以及接受命令名称及其参数的 runCommand() 方法。此方法应循环遍历命令列表,直到其中一个响应、执行相应操作并发送 ok。

责任链

正如我在某些网站上看到的那样,这几乎是相同的,但有以下区别: 每个命令实例都将存储对下一个命令实例的引用,而不是让一个类存储要循环的命令列表。

那么,这种差异是否足以认为两种设计模式不同?

它们适用于哪些实际情况?

【问题讨论】:

    标签: php design-patterns web-applications chain-of-responsibility


    【解决方案1】:

    它们是相同的设计模式。

    如果它们具有相同的属性并且只有实现不同,那么它们在功能上是相同的。这说明这两种设计模式是一回事。

    另一个提示是责任链 DP 有一个维基百科页面,但命令链没有。

    撰写关于 DP 的开创性书籍的“四人帮”非常清楚定义设计模式的行为和属性,而不是实现。

    【讨论】:

    • 它们毕竟具有相同的行为,即使第一个将处理程序存储在主类的属性中,而在第二个处理程序中,每个处理程序都包含对下一个的引用。我认为这也可能是考虑它们不同模式的决定因素。什么实现会更好,正如我问 Atul:这种模式适用于 Web 开发的哪些常见情况?
    • 如果处理程序的数量在设置时往往是固定的并且是已知的,那么从性能的角度来看,像第一个这样的实现是更可取的,因为您可以将处理程序分配为数组。这为引用 pr 保存了一个指针。处理程序。至于模式的适用性:很多很多情况。通常当你想要一些默认行为(链的末端,一个包罗万象的处理程序)结合几个“特殊情况”处理程序时。
    【解决方案2】:

    看起来当有一个处理程序需要根据某个请求执行多个任务时使用命令链,而另一方面,当每个处理程序只能处理一种类型的请求时使用责任链。 例如,如果有火灾警报,您可以向火灾探测器发出请求,它会发出许多命令来检查不同级别或位置的火灾。 而谁来应对这场火灾,比如消防员、保安、警察等,可以通过使用责任链来完成。

    【讨论】:

    • 这个例子清楚地说明了这一点,但是了解 Web 开发中这两种模式的一些真实案例将是完美的。
    【解决方案3】:

    责任链是四人组的原始设计之一,您可以在此处找到几个用 PHP 实现的示例:

    http://www.php5dp.com/category/design-patterns/chain-of-responsibility/

    该模式的一种用途是使用“嗅探器”程序来选择正确的设备,以便与针对不同设备(手机、平板电脑、台式机)具有多种配置的网站一起使用。 CoR 模式避免了发出请求的客户端和处理对象之间的耦合。

    它不是分层的,因为一个“处理对象”不在另一个之上,而是顺序的,因为它会遍历一组选项,直到找到最适合给定请求的选项。

    “指挥链”可能是对 CoR 的误称,也可能是一种完全不同的具有层级结构的模式。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2011-02-15
      • 2011-01-02
      相关资源
      最近更新 更多