Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 责任链与有限状态机-差异_Design Patterns_State Machine_Chain Of Responsibility - Fatal编程技术网

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

Design patterns 责任链与有限状态机-差异,design-patterns,state-machine,chain-of-responsibility,Design Patterns,State Machine,Chain Of Responsibility,所以,作为一名电工和程序员,我认为我非常了解FSM设计模式。它是: 我们有一组节点 每个节点都知道,当程序位于该节点时,该做什么 每个节点都包含对另一个选定节点的引用,并且知道在什么条件下他应该继续到选定的节点 在事件或处理节点后,节点继续到下一个选择的节点 我想,这对我来说很清楚。尽管最近,当我实施一个状态机时,一个人告诉我,这实际上是一个经过修改的责任链(不确定他是否正确),我所做的/曾经做过的是: 节点集(不表示线性或树结构) 节点有对象,它们知道在什么条件下应该跳转到哪个节点 每个

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

  • 我们有一组
    节点
  • 每个
    节点
    都知道,当程序位于该节点时,该做什么
  • 每个
    节点
    都包含对另一个选定节点的引用
    ,并且知道在什么条件下他应该继续到选定的节点
  • 事件
    处理
    节点后,
    节点继续
    到下一个选择的节点
我想,这对我来说很清楚。尽管最近,当我实施一个状态机时,一个人告诉我,这实际上是一个经过修改的责任链(不确定他是否正确),我所做的/曾经做过的是:

  • 节点集
    (不表示线性或树结构)
  • 节点有对象,它们知道在什么条件下应该跳转到哪个节点
  • 每个节点都有自己的处理上下文(上下文的某些部分在节点之间共享)
不幸的是,由于法律问题,我不允许在这里粘贴类图


另一方面,我们有责任链,我(据我所知)将其定义如下:

  • 我们有一些
    ItemToProcess
    接口
  • 我们有一些
    节点
    接口
  • 节点只引用了一个下一个节点
  • 每个节点处理
    ItemToProcess
    并将处理后的一个转发到
    nextNode
据我所知:

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

我想请您确认我对这些设计模式的理解,或者告诉我我在理解上犯了什么错误。

您的理解是正确的

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

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

责任链的常见用途是查找给定输入(如文件类型或扩展名)要使用的处理程序,或查找类路径或资源定位器中的项。您可以将这些类型的操作想象为:

[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
类来扩展处理功能,而不必修改
客户端

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

如果要添加新的具体状态,则状态没有那么灵活。GoF手册显示了此图:

不明显的是(
Handle()
事件耦合到另一个
ConcreteState
类(即下一个状态)。因此,编码一个新的
ConcreteState
可能需要更改一些或所有现有的
ConcreteState


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

太好了,谢谢。我可以问一下你用什么软件来绘制这些类图吗?@Dawidi也许你可以问一下你的问题(如何将UML图放入问题或答案中?),我会回答。