EA&UML日拱一卒-状态图::不是模式的模式

来源:互联网 发布:tm商标域名 编辑:程序博客网 时间:2024/05/29 10:00

针对车辆的数字式信号的状态机设计完成之后,按道理可以继续设计标准的车辆信号或者行人信号等。但是如果你回头看看数字式车辆信号的设计,应该可以明白:它们其实都是大同小异。所以这部分就留给大家可以自己设计了。


不是模式的模式


作为对系统建模的基本模式,大致可以遵循以下的方式来进行。


  1. 隔离系统中的小的功能模块并根据前面提到的面向对象原则建模。

  2. 设定一个系统的管理者或者组织者来管理各个共通模块,用于实现和具体相关的部分。


虽然这并不是什么设计模式,但是按照这种方式建模,可以让设计有一个良好的开端。


在交通信号系统这个例子中,车辆信号灯,行人信号灯,行人按钮,停止按钮等就是可以共通化的小模块;而信号系统就是这个系统的组织者,为了将功能进一步分离,我们另外设置了信号系统引擎来协调和控制信号的动作。


信号系统引擎TrafficSystemEngine


先看图。



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状态。


写在文章的最后


既然已经读到这里了,拜托大家再用一分钟时间,将文章转发到各位的朋友圈,微信群中。

本公众号的成长需要您的支持!

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】


原创粉丝点击