因为我是一名电工和程序员,我认为我非常了解FSM设计模式。它是:
Nodes
,Node
都知道该怎么做Node
contains references to another chosen nodes
,并且知道在什么条件下,他应该继续选择的那个。 event
或after processing
节点上,Node proceeds
到下一个选择的节点我想,这对我来说很清楚。虽然最近,当我实施一台国家机器时,一个人告诉我,事实上它有点修改了责任链(不确定他是否正确),我做了什么/曾经做过:
Nodes
的集合(未表示线性或树状结构)不幸的是,我担心,由于法律问题,我不允许在这里粘贴类图。
另一方面,我们有责任链,我(按照我的理解)以下列方式定义,即:
ItemToProcess
界面,Node
界面,ItemToProcess
并将已处理的节点转发到nextNode
据我所知:
Chain Of Responsibility
,我们希望每个节点处理(或至少尝试处理)一个项目StateMachine
来表示图表StateMachine
执行计算,根据某些事件,计算的顺序可能会有所不同。我想请你确认我对这些设计模式的理解,或者告诉我在理解上的错误。
答案 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
类。
但是,必须修改构建链的代码以将新处理程序添加为对象:
如果要添加新的具体状态,
状态不够灵活。 GoF书籍显示了这个图表:
什么不明显(在this answer中阅读更多内容)是Handle()
事件耦合到另一个ConcreteState
类(即下一个状态)。因此,对新ConcreteState
进行编码可能需要对部分或全部现有ConcreteState
类进行更改。
在State模式中添加新状态可能不像在Chain of Responsibility模式中添加新处理程序那么容易。