责任链与有限状态机 - 差异

时间:2015-11-04 20:41:15

标签: design-patterns state-machine chain-of-responsibility

因为我是一名电工和程序员,我认为我非常了解FSM设计模式。它是:

  • 我们设置了Nodes
  • 当程序在此节点中时,每个Node都知道该怎么做
  • 每个Node contains references to another chosen nodes,并且知道在什么条件下,他应该继续选择的那个。
  • eventafter processing节点上,Node proceeds到下一个选择的节点

我想,这对我来说很清楚。虽然最近,当我实施一台国家机器时,一个人告诉我,事实上它有点修改了责任链(不确定他是否正确),我做了什么/曾经做过:

  • Nodes的集合(未表示线性或树状结构)
  • 节点有对象,知道在什么条件下它们应该跳转到哪个节点
  • 每个节点都有自己的上下文处理(节点的某些部分在节点之间共享)。

不幸的是,我担心,由于法律问题,我不允许在这里粘贴类图。

另一方面,我们有责任链,我(按照我的理解)以下列方式定义,即:

  • 我们有一些ItemToProcess界面,
  • 我们有一些Node界面,
  • 节点引用仅一个下一个节点
  • 每个节点都会处理ItemToProcess并将已处理的节点转发到nextNode

据我所知:

  • 我们使用Chain Of Responsibility,我们希望每个节点处理(或至少尝试处理)一个项目
  • 责任链代表顺序和持续执行流程
  • 我们使用StateMachine来表示图表
  • 我们使用StateMachine执行计算,根据某些事件,计算的顺序可能会有所不同

我想请你确认我对这些设计模式的理解,或者告诉我在理解上的错误。

2 个答案:

答案 0 :(得分:4)

您的理解是正确的。

我想补充一点,FSM中的节点是不同的状态。切换到其他节点时,更改状态。您可以连续几次调用相同的状态/节点。

责任链没有不同的状态。正如你所说,链中的每个节点都试图处理一个对象,如果一个节点成功处理了该对象,那么通常链就会停止。

责任链的常见用途是查找用于确定Handler用于给定输入的内容,例如文件类型或扩展或在类路径或资源定位器中查找项目。您可以将这些类型的操作视为:

[Node 1]

"-Do you know what this is?"
-No
[Node 2]
"-Do you know what this is?"
-No
[Node 3]
"-Do you know what this is?"
-Yes!

完成

答案 1 :(得分:3)

我将补充另一个答案,他说设计模式也考虑使软件易于扩展。

责任链的优势在于能够编写新的ConcreteHandler类来扩展您的处理功能,而不必修改Client类。

Class diagram of GoF Chain of Responsibility

但是,必须修改构建链的代码以将新处理程序添加为对象:

Object diagram of GoF Chain of Responsibility

如果要添加新的具体状态,

状态不够灵活。 GoF书籍显示了这个图表:

Class diagram of GoF State

什么不明显(在this answer中阅读更多内容)是Handle()事件耦合到另一个ConcreteState类(即下一个状态)。因此,对新ConcreteState进行编码可能需要对部分或全部现有ConcreteState类进行更改。

在State模式中添加新状态可能不像在Chain of Responsibility模式中添加新处理程序那么容易。