1. 程式人生 > >重新思考Swift中的設計模式:狀態模式

重新思考Swift中的設計模式:狀態模式

本文展示瞭如何在Swift中實現State模式,利用Swift的強大功能使實現更簡單,更靈活。我們通過一個例子來探索狀態模式的各個方面,並評估其處理需求變化的能力。然後,我們將瞭解關鍵實現注意事項以及模式的優點和實際應用。 #有限狀態自動機 真實世界域通常包含可以在任何時間點處於有限數量的可能狀態之一的實體。根據實體所處的狀態,它可能對同一個動作或事件的反應不同。

考慮一個典型的自動售貨機。當沒有插入錢時,按下應該銷售特定專案的按鈕無效。這是因為機器未處於執行該操作的正確狀態。即使插入了錢,機器也可以出售一些物品而不是其他物品,這取決於插入了多少錢以及每件物品的成本。一旦給出了支付的物品,機器就會回到不收錢的狀態下賣掉的東西。

可以使用有限狀態自動機或有限狀態機有效地對這些型別的實體進行建模。有限狀態自動機或有限狀態機,或簡稱為狀態機,是一種抽象機器,可以處於有限數量的狀態中的任何一個狀態,並且可以響應於某些觸發事件在這些狀態之間轉換。

可以使用條件語句(通常是巢狀的switch語句)在程式碼中實現簡單狀態機。對於非常簡單的狀態機實現,這可能是足夠的,並且非常有效。但是,這種方法不能很好地擴充套件。在處理更復雜的狀態機時,它可能導致程式碼繁瑣,難以理解且難以維護。

狀態模式是實現狀態機的強大且可擴充套件的方式。特定於狀態的行為由各種狀態型別封裝,被建模的實體將事件和操作委託給它們。管理國家之間轉換的規則也可以由州自己管理。 #狀態模式 ##1. 定義 狀態模式允許型別的例項通過其內部狀態的更改來更改其行為。從外部角度來看,例項可能會改變其型別。 ##2. 結構與參與者 下面的類圖說明了State模式的結構:

Context型別定義客戶端使用的介面。抽象狀態型別反過來定義了一個由Context使用的介面,該介面封裝了Context的特定於狀態的行為。每個具體的State型別實現與Context的特定狀態相關聯的行為。因此,Context能夠將特定於州的行為委託給具體的State型別。

模式的靈活性來自於Context僅依賴於抽象State型別而不依賴於任何具體State型別的事實。因此,當Context從一個狀態轉換到另一個狀態時,可以交換具體狀態型別的例項。 #狀態機圖 狀態機圖或狀態圖是視覺化狀態機的好方法。每個狀態由圓角矩形表示,連線矩形的箭頭表示狀態之間的轉換。如果狀態機具有預設初始狀態,則使用小的實心圓來表示初始偽狀態,其通常自動轉換到第一適當狀態。

讓我們假設我們的任務是為安全系統構建控制單元,當存在入侵或入侵威脅時,它會發出警報。安全系統將連線到感測器,每個感測器都可以檢測到漏洞,例如正在開啟的門或窗戶。當系統佈防時,這種違規行為應該引起警報。該系統還將具有一個或多個應急開關,即使沒有實際的突破也可用於發出警報,但可能存在潛在入侵者的突然威脅。當系統未佈防時,違規或恐慌訊號不應起作用。

我們還需要確保一旦武裝起來,只能通過使用程式碼解除系統的武裝。系統初始化時將設定此程式碼,並且必須用於撤防系統。同樣的程式碼也必須用於重置系統,即一旦發出警報就停止警報。

如果我們將上述安全系統視為狀態機,我們可以通過以下狀態圖直觀地表示它:

雖然該圖非常直觀,但是根據統一建模語言(UML)規範,讓我們簡要地看一下它的組成部分和一些管理狀態圖構造的形式。 ##1. 狀態,事件和過渡 我們的系統可以處於以下三種狀態中的任何一種:解除武裝,武裝和警報。 Disarmed狀態是預設的初始狀態。

狀態之間的轉換可能由以下事件引起:

  • 手臂:僅適用於撤防狀態。導致轉換到武裝狀態。
  • 解除武裝:僅適用於武裝狀態。導致轉換到撤防狀態。
  • 違反:表示感測器已被破壞。僅適用於武裝狀態。導致轉換到警報狀態。
  • 恐慌:表示已啟用緊急切換。僅適用於武裝狀態。導致轉換到警報狀態。
  • 重置:僅適用於警報狀態。導致轉換到撤防狀態。

##2. 各個狀態的進入退出活動 狀態機中的任何狀態都可以具有進入和退出活動。在輸入狀態之後執行輸入活動,而在退出狀態之前執行退出活動。為狀態指定活動不是強制性的,但它是確保狀態封裝與其關聯的行為的有用方法。在我們的示例中,每個州都有一個條目活動,而只有警報狀態有一個退出活動。 ##3. 保證條件和過渡效果 轉換的完整規範可以包含四個部分 - 事件,保護條件,效果和目標狀態。事件是觸發轉換的事件,目標狀態是在轉換完成時變為活動狀態。保護條件是一個布林表示式,它被計算並且僅當表示式求值為true時才會觸發轉換。效果是在轉換完成之前(即,在目標狀態變為活動之前)執行的可選活動。

轉換標籤可以包括事件,保護條件和效果,格式為:'event [guard condition] / effect'。在我們的示例中,兩個轉換具有保護條件。這些確保只能使用有效程式碼撤防和重置系統。我們在示例中的任何轉換中都沒有使用效果。