天天看點

EA&UML日拱一卒-狀态圖::不是模式的模式

針對車輛的數字式信号的狀态機設計完成之後,按道理可以繼續設計标準的車輛信号或者行人信号等。但是如果你回頭看看數字式車輛信号的設計,應該可以明白:它們其實都是大同小異。是以這部分就留給大家可以自己設計了。

不是模式的模式

作為對系統模組化的基本模式,大緻可以遵循以下的方式來進行。

  1. 隔離系統中的小的功能子產品并根據前面提到的面向對象原則模組化。
  2. 設定一個系統的管理者或者組織者來管理各個共通子產品,用于實作和具體相關的部分。

雖然這并不是什麼設計模式,但是按照這種方式模組化,可以讓設計有一個良好的開端。

EA&UML日拱一卒-狀态圖::不是模式的模式

在交通信号系統這個例子中,車輛信号燈,行人信号燈,行人按鈕,停止按鈕等就是可以共通化的小子產品;而信号系統就是這個系統的組織者,為了将功能進一步分離,我們另外設定了信号系統引擎來協調和控制信号的動作。

信号系統引擎TrafficSystemEngine

先看圖。

EA&UML日拱一卒-狀态圖::不是模式的模式

AllStop狀态

系統啟動時的準備狀态,這段時間行人方向和車輛方向都是紅燈。當狀态持續一定時間以後,向VehicleGo狀态遷移。離開本狀态時,設定停止按鈕為有效狀态。

VehicleGo狀态

車 輛正常通行狀态。在進入這個狀态時,向數字式車輛信号燈發送Red2Green信号并允許行人按鈕操作。本狀态收到來自行人通過請求按鈕的指令時向 VehicleCounter狀态遷移;接受來自系統停止按鈕的指令時也會向VehicleCounter狀态遷移,但是同時會設定 ShutdownFlag。

另外在本狀态中設定了MininumTimeGreen和VehicleWaitButton兩個子狀态。

MininumTimeGreen維持一定的時間,在這個狀态下如果行人按下通過請求按鈕系統不會立即切換信号狀态以保證足夠的車輛通行時間。本狀态期間發生的按鈕按下時間都會被儲存,以便在後面處理。

VehicleWaitButton狀态時首先向行人按鈕子產品發送HandlerReady信号,如果在MininumTimeGreen已經有行人按下通行按鈕,則直接遷移到VehicleCounter狀态;如果沒有則切換行人按鈕處理子產品到立即報告狀态,然後等待行人按下通行請求按鈕。

VehicleCounter狀态

顯示綠燈倒計時。進入狀态時,向車輛信号燈發送向倒計時狀态遷移的通知。進入狀态以後在UpdateCounter中按一定間隔向車輛信号燈發送時間更新要求。設定的時間經過以後,遷移到VehicleStopSafely狀态。

VehicleStopSafely狀态

車輛信号等黃燈閃爍狀态。進入該狀态時,向車輛信号燈發送向安全停止狀态遷移的通知。離開狀态時,向車輛信号燈發送向紅燈狀态遷移的通知。

退出該狀态的條件是計時時間到。離開本狀态後,如果ShutdownFlag為真則進入停止狀态;否則進入PedestrainGo狀态。

PedestrianGo狀态

行人通行狀态。進入該狀态時,向行人信号燈發送向通行狀态遷移的通知并向音響系統發送開始播放指令。經過一定時間以後退出改狀态。離開狀态時,向音響系統發送停止指令。另外在本狀态下按下停止按鈕也會退出本狀态,但同時會設定ShutdownFlag為真。

PedestrainFinshCrossing狀态

行 人停止通過狀态,已經進入道路的,迅速離開。進入該狀态時,向行人信号燈發送向停止通過狀态遷移的通知。經過一定時間以後退出改狀态。離開狀态時,向行人 信号燈發送向禁止通行狀态遷移的通知。離開本狀态後,如果ShutdownFlag為真則進入停止狀态;否則進入VehicleGo狀态。

閱讀更多更新文章,請掃描下面二維碼,關注微信公衆号【面向對象思考】