2

因此,当我是一名电工和程序员时,我认为我非常了解FSM设计模式。它是:责任链vs有限状态机 - 差异

  • 我们已经设置了一个Nodes
  • 每个Node知道,做什么,什么时候计划是在这个节点上,
  • 每个Nodecontains references to another chosen nodes,什么条件下都知道,他应该继续被选中的人。
  • eventafter processing节点,Node proceeds下一个选择的节点

我想,这是很清楚的给我。虽然最近,当我实现状态机一个人告诉我,这是事实,责任位修饰链(不知道他是正确的),并且我做了什么/曾是:

  • 套装的Nodes(这并不代表线性或树形结构)
  • 节点有对象,知道在此条件下,他们应该跳转到哪个节点
  • 每个节点有它的自己处理的情况下(上下文的某些部分在节点之间共享)。

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


在我们有责任,我将(据我所知)以下列方式定义的链另一方面,那就是:

  • 我们已经得到了一些ItemToProcess接口,
  • 我们已经得到了一些Node接口,
  • 节点具有只有一个下一个节点的引用,
  • 每个点头Ë处理ItemToProcess和转发处理,一到nextNode

所以据我了解:

  • 我们使用Chain Of Responsibility,在这里我们要处理一个项目(或至少试图成为处理)节点
  • 责任链表示顺序和常数执行进程
  • 我们使用StateMachine表示图
  • 我们使用StateMachine执行计算,其顺序或种计算的可取决于一些事件而变化

我想请你确认一下我对这些设计模式的理解,或者告诉我我在理解上犯的错误。

回答

3

你的理解是正确的。

我想补充一下,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! 

3

我会补充其他答案:你可以把这些操作类型为的。

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

Class diagram of GoF Chain of Responsibility

该版本链中的代码,但是,必须进行修改,以增加新的处理程序作为一个对象:

Object diagram of GoF Chain of Responsibility

如果你想国家不灵活添加新的具体状态。 GOF的书表明此图:

Class diagram of GoF State

什么不是很明显(阅读更多this answer)是Handle()事件被耦合到另一ConcreteState类(即下一个状态)。因此,编写新的ConcreteState可能需要更改部分或全部现有的ConcreteState类。

在状态模式中添加新状态可能并不容易,因为它是在责任链模式中添加新处理程序。

+0

太好了,谢谢。我可以问你用什么软件绘制这些类图吗? – DawidPi

+0

@DawidPi也许你可以问你的问题(如何在问题或答案中放置UML图?),我会回答。 – Fuhrmanator

+0

http://meta.stackoverflow.com/questions/309523/how-one-should-add-uml-diagrams-to-the-question-or-answer – DawidPi