【正确答案】
【答案解析】(1)state == CLOSED || state == CLOSING
(2)state == OPENING || state == STAYOPEN
(3)state == OPEN
(4)state->click()
(5)state->timeout()
(6)state->complete()
(7)door->setState(door->OPENING)
[分析]
本题考查的是状态转换图的程序设计与实现。
空(1)、(2)和(3)需要根据状态转换图来填写,空(1)、(2)和(3)所在的方法为click,表示当发生click事件时应该发生什么状态转换。根据代码可知,发生click事件时,状态分别跳转到OPENING,CLOSING和STAYOPEN,则发生click前的状态由状态转换图可以得到,分别为CLOSED或CLOSING、STAYOPEN或OPENING以及OPEN。
代码2中空(4)、(5)和(6)考查当发生click、timeout以及complete事件的时候,状态应该如何迁移。类Door的state成员变量用于记录类Door所处的状态,而state变量的类型为DoorState *,DoorState中分别具有click、timeout和complete方法用来响应对应的事件,因此,空(4)、(5)和(6)分别为:state->click()、state->timeout()和 state->complete()。
空(7)主要考查门的当前状态为CLOSED时,发生click事件时状态的迁移。根据状态图可知,CLOSED状态的在click事件下将迁移到OPENING,因此,此处应该将传输门状态设置为OPENING,DoorState变量存储了当前其存储的传输门的实例,因此,可直接调用其方法setState来设置状态,由于传输门状态采用类的实例变量表示,所以此处应该填写door->setState(door->OPENING)。
代码1和代码2的区别是:代码2将状态间的转换规则封装到具体的类中,当状态转换图的转换规则发生变化时,只需更改部分对应类中的状态迁移规则,而代码1中的迁移规则散落在程序中,维护起来较为困难。