2

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

  • 指挥链
  • 责任链

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

这是我对每个的理解:

指挥链:

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

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

责任链

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

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

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

4

3 回答 3

5

它们是相同的设计模式。

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

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

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

于 2012-10-04T07:51:17.320 回答
1

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

于 2012-10-03T12:41:52.410 回答
0

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

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

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

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

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

于 2014-07-30T10:16:40.717 回答