2016-02-12 150 views
2

我正在研究使用State模式將我的代碼中的大switch語句轉換爲更易於管理的塊。我可以得到關於國家行爲模式的一些說明嗎?

我一直在閱讀關於它的Design Patterns book,並且還在看教程點示例here

該示例中的代碼對我來說看起來不對,因爲作者從Context以外調用State功能。那是對的嗎?

這是我的理解,它應該是狀態的包裝的上下文,並且State更改應該最有可能從每個State對象中處理。否則,它有點擊敗了目的?

在谷歌上搜索,試圖找到設計模式一書State模式如下圖:

State Behavioral Pattern

我遇到this example,這正符合我的想法更多。 所以,我正確地認爲教程點示例不正確,並且State應該由狀態自己更改,或者Object通過調用context.request()來保存Context

有沒有像在教程點示例中那樣做的有效案例?我無法親自看到它,如果你這樣做,你只會以另一個switchif聲明結束。

回答

1

該示例中的代碼對我來說看起來是錯誤的,因爲作者正在從上下文之外調用狀態功能。那是對的嗎?

是的,你是真實的,給定的例子不佳說明了狀態模式它更是一個戰略這裏,因爲上下文對象接收適應它自身的一個新的行爲來代替。

......狀態應該由狀態自己或通過調用context.request()來保存上下文的Object來更改?

沒錯。國家班級有責任設置上下文的「下一個狀態」。狀態機可以很容易地使用狀態模式創建的:

  • 上下文是當前狀態被更新的機器,它擁有一些決策信息
  • 每個狀態定義了執行的動作和測試「轉換」到其他根據上下文狀態。如果發生轉換,則上下文的狀態會更新爲新狀態。

有沒有像在Tutorials Point例子中那樣做的有效案例?我不能親自看到它,如果你這樣做,你只是要結束另一個開關或聲明。

我看到兩個原因來更新來自外部的上下文的狀態:

  • 選擇的上下文的初始狀態(可以通過構造被注入)
  • 中斷或重置上下文中,它例如在接收ISR時在嵌入式世界中經常是這種情況。
1

是的,你是正確的上下文只能訪問狀態:上下文作爲狀態的唯一客戶端。

這是在java中執行狀態的example

相關問題