责任链与有限状态机——差异
Chain of responsibility vs Finite State Machine - differences
因此,作为一名电工和程序员,我认为我非常了解 FSM 设计模式。它是:
- 我们有一套
Nodes
,
- 每个
Node
知道,当程序在这个节点时要做什么,
- 每个
Node
contains references to another chosen nodes
,并且知道在什么情况下,他应该继续选择一个。
- 在
event
或after processing
一个节点上,Node proceeds
到下一个选择的节点
我想,我已经很清楚了。尽管最近,当我在实现状态机时,有人告诉我,它实际上是对责任链进行了一些修改(不确定他是否正确),而且我 did/had 是:
- 一组
Nodes
(未表示线性或树结构)
- 节点有对象,知道在什么条件下它们应该跳转到哪个节点
- 每个节点都有自己的处理上下文(部分上下文在节点之间共享)。
不幸的是,由于法律问题,我不能在这里粘贴 class 图。
另一方面,我们有责任链,我将(据我理解)以下列方式定义,即:
- 我们有一些
ItemToProcess
接口,
- 我们有一些
Node
接口,
- 节点引用了只有一个下一个节点,
- 每个节点处理
ItemToProcess
并将处理的一个转发给 nextNode
据我了解:
- 我们使用
Chain Of Responsibility
,我们希望 一个 项目被 each[=70 处理(或至少尝试处理) =]节点
- 责任链表示顺序和恒定流程执行
- 我们用
StateMachine
来表示图
- 我们使用
StateMachine
来执行计算,计算的顺序或类型 可能因某些事件而异。
我想请你确认我对那些设计模式的理解,或者告诉我我理解错误的地方。
你的理解是正确的。
我要补充一点,FSM 中的节点是不同的状态。当您切换到不同的节点时,您会更改状态。您可以连续多次调用相同的 state/node。
责任链没有不同的状态。正如您所说,链中的每个节点都尝试处理一个对象,如果一个节点成功处理了该对象,那么通常链会停止。
责任链的常见用途是查找,以确定对给定输入(例如文件类型或扩展名)使用什么处理程序,或者在类路径或资源定位器中查找项目。您可以将这些类型的操作视为:
[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!
完成
我将通过说设计模式还考虑使软件易于扩展来补充其他答案。
责任链 的优点是能够编写新的 ConcreteHandler
classes 来扩展您的处理功能,而无需 Client
class需要修改
但是,构建链的代码必须修改以将新处理程序添加为对象:
如果您想添加新的具体状态,State 就不那么灵活了。 GoF 书中显示了这张图:
不明显的(在 this answer 中阅读更多内容)是 Handle()
事件与另一个 ConcreteState
class(即下一个状态)耦合。因此,编写新的 ConcreteState
可能需要更改部分或全部现有 ConcreteState
classes。
在状态模式中添加新状态可能不像在责任链模式中添加新处理程序那么容易。
因此,作为一名电工和程序员,我认为我非常了解 FSM 设计模式。它是:
- 我们有一套
Nodes
, - 每个
Node
知道,当程序在这个节点时要做什么, - 每个
Node
contains references to another chosen nodes
,并且知道在什么情况下,他应该继续选择一个。 - 在
event
或after processing
一个节点上,Node proceeds
到下一个选择的节点
我想,我已经很清楚了。尽管最近,当我在实现状态机时,有人告诉我,它实际上是对责任链进行了一些修改(不确定他是否正确),而且我 did/had 是:
- 一组
Nodes
(未表示线性或树结构) - 节点有对象,知道在什么条件下它们应该跳转到哪个节点
- 每个节点都有自己的处理上下文(部分上下文在节点之间共享)。
不幸的是,由于法律问题,我不能在这里粘贴 class 图。
另一方面,我们有责任链,我将(据我理解)以下列方式定义,即:
- 我们有一些
ItemToProcess
接口, - 我们有一些
Node
接口, - 节点引用了只有一个下一个节点,
- 每个节点处理
ItemToProcess
并将处理的一个转发给nextNode
据我了解:
- 我们使用
Chain Of Responsibility
,我们希望 一个 项目被 each[=70 处理(或至少尝试处理) =]节点 - 责任链表示顺序和恒定流程执行
- 我们用
StateMachine
来表示图 - 我们使用
StateMachine
来执行计算,计算的顺序或类型 可能因某些事件而异。
我想请你确认我对那些设计模式的理解,或者告诉我我理解错误的地方。
你的理解是正确的。
我要补充一点,FSM 中的节点是不同的状态。当您切换到不同的节点时,您会更改状态。您可以连续多次调用相同的 state/node。
责任链没有不同的状态。正如您所说,链中的每个节点都尝试处理一个对象,如果一个节点成功处理了该对象,那么通常链会停止。
责任链的常见用途是查找,以确定对给定输入(例如文件类型或扩展名)使用什么处理程序,或者在类路径或资源定位器中查找项目。您可以将这些类型的操作视为:
[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!
完成
我将通过说设计模式还考虑使软件易于扩展来补充其他答案。
责任链 的优点是能够编写新的 ConcreteHandler
classes 来扩展您的处理功能,而无需 Client
class需要修改
但是,构建链的代码必须修改以将新处理程序添加为对象:
State 就不那么灵活了。 GoF 书中显示了这张图:
不明显的(在 this answer 中阅读更多内容)是 Handle()
事件与另一个 ConcreteState
class(即下一个状态)耦合。因此,编写新的 ConcreteState
可能需要更改部分或全部现有 ConcreteState
classes。
在状态模式中添加新状态可能不像在责任链模式中添加新处理程序那么容易。