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