9

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

  • 我们有一组Nodes
  • 每个人都Node知道,该做什么,当程序在这个节点时,
  • 每个Node contains references to another chosen nodes人,并且知道在什么条件下,他应该前往所选择的人。
  • eventafter processing一个节点上,Node proceeds到下一个选择的节点

我想,这对我来说很清楚。虽然最近,当我实施状态机时,一个人告诉我,它实际上是一个有点修改的责任链(不确定他是否正确)并且,我所做/拥有的是:

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

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


另一方面,我们有责任链,我会(据我了解)以以下方式定义,即:

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

据我了解:

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

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

4

2 回答 2

6

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

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

GoF责任链类图

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

GoF责任链对象图

如果你想添加新的具体状态,状态就不那么灵活了GoF 书显示了此图:

GoF State的类图

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

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

于 2015-11-05T14:58:00.860 回答
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!

完毕

于 2015-11-04T21:45:58.713 回答