在使用Star UML工具画状态图时,状态之间的转移事件分为4种:SignalEvent、CallEvent、TimeEvent和ChangeEvent。个人对这4种Event的理解如下:
1、SignalEvent
来自于本对象(模块、单元)外部,需要本对象消耗资源去监控是否发生的Event,可作为SignalEvent。
SignalEvent并非本对象产生,而是由本对象以外的其它对象产生。生产SignalEvent的那个对象只是自顾自的干活儿,干完拉到。就好比食堂里做饭的大爷(其它对象),每天只负责做饭,饭做好了往盘子里一倒,爱吃不吃,不会通知你(本对象)去吃。如果你想要吃口热乎的,就要花点精力(消耗资源)时不时跑食堂看看饭有没有做好。此时,“饭做好了”这个就是SignalEvent,可能会导致你从“上班状态”进入“吃饭状态”。
2、CallEvent
来自于本对象(模块、单元)外部,当发生时会主动通知你(Call me, honey!)发生的Event,可称作为CallEvent。
同SignalEvent一样,CallEvent也不是本对象产生的,而是其它对象产生的。区别在于,当其它对象生产CallEvent时会主动通知本对象。好比媳妇儿在家做饭,饭做好了会主动告诉你(Call me)。在这个过程种你(本对象)不需要花费精力(消耗资源)去看饭有没有做好(事件发生),而是享受了VIP待遇。CallEvent可能导致你从“看电视”状态进入“吃饭状态”。当然,你也可以忽略Event(比如此时电视节目很精彩)。
3、TimeEvent
这个就是定时事件,由于比较普遍,所以单独列出来。如果把定时器看作是另外一个对象,那么当定时时间超时,这个定时器对象就会通知(Call)你,因此TimeEvent也是可以通过调用(Call)来发挥作用的。
4、ChangeEvent
我理解的ChangeEvent与上面三个事件不同,上面的Event都不是本对象生产的,而ChangeEvent则是本对象自身生产的事件,并可能导致本对象的状态发生某些变化。在这里,本对象就变成了上文例子中做饭的大爷或媳妇儿。他们本身就是负责做饭的,饭做没做好自己就知道,并有可能导致他们从“做饭状态”进入“吃饭状态”。
以上可知,使用SignalEvent驱动状态机运行的两个对象之间耦合较少,有利于设计上的解耦,但需要系统消耗一定资源对SignalEvent进行监视,而CallEvent要求两个对象之间互相知道对方的存在,设计上耦合较大,但使用方便,不需要消耗额外的系统资源监视Event是否发生,在实际使用过程中应综合考虑。