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

Daw*_*dPi 7 design-patterns state-machine chain-of-responsibility

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

  • 我们有一套Nodes,
  • Node当程序在此节点中时,每个人都知道该做什么,
  • 每个人都Node contains references to another chosen nodes知道在什么条件下,他应该继续选择一个.
  • eventafter processing节点,Node proceeds到下一个选择的节点

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

  • 一组Nodes(未表示线性或树形结构)
  • 节点有对象,知道在哪种情况下它们应该跳转到哪个节点
  • 每个节点都有自己的处理上下文(节点的某些部分在节点之间共享).

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


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

  • 我们有一些ItemToProcess接口,
  • 我们有一些Node接口,
  • Node 引用一个下一个Node,
  • 每个节点处理ItemToProcess并转发处理过的一个节点nextNode

据我所知:

  • 我们使用Chain Of Responsibility,我们想要一个被处理的项目(或至少试图要处理)的每个节点
  • 责任链表示流程的顺序和持续执行
  • 我们StateMachine用来表示图表
  • 我们StateMachine用来执行计算,计算的顺序或种类可能因某些事件异.

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

dka*_*zel 5

你的理解是正确的。

我想补充一点,FSM 中的节点是不同的状态。当您切换到不同的节点时,您会更改 state。您可以连续多次调用同一个状态/节点。

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

责任链的常见用途是查找用于确定用于给定输入(例如文件类型或扩展名)的 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!
Run Code Online (Sandbox Code Playgroud)

完毕


Fuh*_*tor 5

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

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

GoF责任链类图

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

GoF责任链对象图

国家如果要添加新的具体状态是不够灵活。GoF书展示了这个图:

GoF状态类图

不明显的(在这个答案中阅读更多)是Handle()事件耦合到另一个ConcreteState类(即下一个状态)。因此,编写新代码ConcreteState可能需要更改部分或全部现有ConcreteState类。

在状态模式中添加新状态可能不像在责任链模式中添加新处理程序那么容易。