java 电梯类图,电梯控制系统(用UML图理解)

5.9  电梯控制系统

在前面几节中,讨论了用于实现单个UML图的基本技术。现在,将演示如何将所有这些技术应用到实际问题中去。下面是简化的电梯控制系统的描述。

电梯由门、监视器和电梯控制器组成。电梯控制器负责控制电梯系统(如图5-48所示中的类图)。乘客通过按动每层楼的按钮或者电梯内的控制面板来与电梯系统进行交互。一般来说,电梯停在楼宇的底层(第0层)。如果乘客进入电梯并按了去第n层的按钮,电梯将升向第n层。当电梯到达所请求的楼层的时候(也就是说第n层),它将打开门M秒钟,然后关上门。电梯变成闲置。

1b0a55668010407b1fe43b2c959311c3.png

图5-48  电梯控制系统的分析类图

在第m层的乘客通过按动向上或者向下按钮请求电梯。电梯将移向第m层,到达后打开门。乘客想要到达某层,他可以通过按动电梯内控制面板上的按钮来实现。如果在M秒钟之内没有与乘客交互,电梯将返回到底层。

根据分析类图和问题陈述,就可以开发顺序图进一步细化系统在不同场景中的动态行为。然后可以使用顺序图来开发电梯控制系统的状态图,它是整个系统的控制对象。

下面是电梯控制系统的第一个场景。

5.9.1  场景1

乘客Peter在楼宇底层进入电梯等待室。他按动向上按钮并等待电梯到达。当电梯到达的时候,电梯打开,他进入电梯并按动电梯内部控制面板上的第6层按钮。电梯关闭并向上升起直至到达第6层。电梯打开,Peter走出电梯。电梯等待片刻(10秒钟),关闭然后再次向下到达底层。电梯将呆在底层等待与其他用户交互。

如图5-49所示为第一个场景的顺序图。通过仔细考察这个场景中事务序列中的每个步骤,可以开发出这幅图。对于每一个步骤,参与者执行了某个动作,系统相应地进行响应。参与者的输入和系统的响应将有助于确定系统内部需要执行哪些内部动作。参与者的输入被边界对象接收。然后边界对象发送一条消息给控制对象以处理参与者的输入。控制对象需要向实体对象发送一条或者多条消息,执行实际的请求动作。最后,控制对象将向边界对象发送消息,以响应参与者。下面是这个场景的动作序列。

●       Peter在楼宇底层按动向上按钮。按动按钮事件将发送给电梯控制器。现在,请考虑电梯系统将要执行什么。因为电梯在底层,所以电梯控制器应该开门。

●       Peter按下第6层按钮。按动事件将发送给电梯控制器。电梯控制器等待超时,关闭门,控制马达向上升起并等待到达事件。当电梯到达第6层之后,电梯控制器将打开门。在动作序列中,电梯控制器与门对象和马达对象交互。

根据图5-49中的顺序图,开发电梯控制系统器的部分状态图(如图5-50所示)。如图5-51所示为顺序图(图5-49)中电梯控制器的部分状态图。通过采取以下过程开发电梯控制器和其他控制对象的状态图。

●       因为状态表示时间延续,所以将两条相继到达电梯控制器的输入消息之间的时间作为一个状态。

●       如果某个动作需要相当长的时间才能完成,那么将这段时间作为一个状态。例如,电梯需要相当长的一段时间进行升降。可以将花费在升降上的时间作为状态。

●       在这个场景发生之前控制器应该处于这个状态。

当电梯接收到输入消息或者事件的时候,从一个状态转换到另一个状态。如果转换不是无条件的,可以从场景的条件来确定该转换的守卫条件。

f3ffbf82cfe5b0e44e10d1cc9d8dfb79.png

图5-49  场景1的顺序图

655c26b430252afa49e81837afd9fff2.gif

图5-50  电梯控制器的部分状态图

f1adc38b983a7d97def7cb5a9aff3b16.gif

图5-51  从电梯控制器的顺序图而来的部分状态图

例如,电梯控制器在场景1中的状态图可以相应地开发出来,如下所述。

●       在发生任何交互之前,电梯等候在底层,电梯门关闭;在接收到任何消息或者事件之前,电梯控制器处于底层状态。

●       当电梯控制器从底层的UP按钮处接收到请求消息的时候,电梯控制器打开门,将其状态改变为等待楼层号,即等待乘客按动目标楼层数字。注意,电梯乘客可以按动他当前所在的楼层的编号。

●       乘客按动第6层按钮,电梯控制器不做任何事情,直到接收到超时事件。在此期间,电梯的状态不会发生改变。

●       当电梯控制器接收到超时事件,电梯控制器关闭门,发动马达向上移动(因为第6层要比当前楼层要高),然后改变它的状态。因为上升动作会持续相当长的一段时间,所以将这个状态命名为上升。其守卫条件是目的楼层比当前楼层高。

●       当电梯控制器接收到到达事件,电梯停止马达,打开门,并等待乘客再次按动目的楼层。因此,电梯控制器重新变回了等待楼层号状态。

●       当没有请求时(没有乘客),电梯控制器接收到超时事件,电梯控制器将移动电梯,回到底层。将这个状态命名为归航。

5.9.2  场景2

乘客Mary在第6层。她按动电梯等待室里的向下按钮召唤电梯并等待。电梯此时在底层,要上升至第6层。电梯停在第6层并打开门。Mary走进电梯并按下电梯内部控制面板上的底层按钮。电梯关闭,下降并停在底层。电梯打开。等待片刻(10秒钟),然后关闭门。

如图5-52所示为场景2的顺序图。根据该顺序图,为电梯控制器开发出部分状态图,如图5-53所示。如图5-54所示为如何从图5-52中开发出电梯控制器的部分状态图。

078cfc006d3ad47d6a121739135735f9.png

图5-52  场景2的顺序图

d887ca3af869a8b46f2d3125c5b49c80.gif

图5-53  场景2的部分状态图

通过联合不同场景的状态和转换,合并它们的所有状态图,从而有可能开发出电梯控制器完整的状态图。如果同一个源状态、目标状态和事件存在两个转换,那么将这些转换合并成单个转换,将原有转换的守卫条件合并成一个守卫条件。通过合并图5-50和图5-53,可以开发出电梯控制器完整状态图(如图5-55所示)。

基于这些场景的顺序图和电梯控制器的状态图,细化类图以提供关于系统动态行为的更多信息(如图5-56所示)。单个类中声明的方法用来实现顺序图和状态图中单个类接收到的消息。

电梯控制系统的完整Java源程序见附录。

a0874224ba0e1f18bcd3a22b2db30206.gif

图5-54  从电梯控制器的顺序图开发状态图

e9d09c6e810a97323669e506c9ed4cf2.png

图5-55  电梯控制器的状态图

8c00ca045dcb3bbfab8cdfd0293ad810.png

图5-56  电梯控制系统的类图设计

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值