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

Chain of responsibility vs Finite State Machine - differences

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

我想,我已经很清楚了。尽管最近,当我在实现状态机时,有人告诉我,它实际上是对责任链进行了一些修改(不确定他是否正确),而且我 did/had 是:

不幸的是,由于法律问题,我不能在这里粘贴 class 图。


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

据我了解:

我想请你确认我对那些设计模式的理解,或者告诉我我理解错误的地方。

你的理解是正确的。

我要补充一点,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。

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