问答题
请认真阅读以下关于某传输系统的技术说明、状态转换图及C++代码,根据要求回答问题1和问题2。
【说明】
传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)和Closing(正在关闭)5种状态。触发状态的转换事件有click、complete和timeout
3种,事件与其相应的状态转换如图6-18所示。

下面的【C++代码1】与【C++代码2】分别用两种不同的设计思路对传输门进行状态模拟,请填补代码段中的空缺语句。
【C++代码1】
const int CLOSED = 1; const
int OPENING = 2;
const int OPEN = 3; const
int CLOSING = 4;
const int STAYOPEN = 5;
//定义状态变量,用不同整数表示不同状态
class Door {
private:
private:
int state;
//传输门当前状态
void
setState(int state) { this->state = stale; }
//设置当前状态
public:
Door () :state (CLOSED) { };
void getState() {
//根据当前状态输出相应的字符串
switch(state) {
case OPENING: cout <<"OPENING" << endl;
break;
case CLOSED:
cout << "CLOSED" << endl; break;
case OPEN: cout << "OPEN" << endl;
break;
case CLOSING: cout << "CLOSING" << endl;
break;
case STAYOPEN: cout << "STAYOPEN" << endl; break;
}
}
void click() {
//发生click事件时进行状态转换
if
( (1) ) setState(OPENING);
else if ( (2) )
setState(CLOSING);
else
if ( (3) ) setState(STAYOPEN);
}
void timeout() {
//发生timeout事件时进行状态转换
if (state == OPEN)
setState(CLOSING);
}
void complete() {
//发生complete事件时进行状态转换
if (state == OPENING) setState(OPEN);
else if (state == CLOSING)
setState(CLOSED);
}
};
int
main(){
Door aDoor;
aDoor.getState(); aDoor.click(); aDoor.getState();
aDoor.complete();
aDoor.getState();
aDoor.click(); aDoor.getState(); aDoor.click();
aDoor.getState(); return 0;
}
【C++代码2】
class Door
{
public:
DoorState *CLOSED, *OPENING, *OPEN, *CLOSING, *STAYOPEN,
*state;
Door();
virtual ~Door() { ...
//释放申请的内存,此处代码省略};
void setState(DoorState *state) { this->state = state;
}
void getState() {
//例如,当前状态为CLOSED时,输出字符串为"CLOSED"
};
void click();
void
timeout();
void
complete();
};
Door::Door() {
CLOSED =
new DoorClosed(this);
OPENING = new
DoorOpening(this);
OPEN = new
DoorOpen(this);
CLOSING = new
DoorClosing(this);
STAYOPEN = new
DoorStayOpen(this);
state =
CLOSED;
}
void Door::click(){ (4) ;}
void Door::timeout(){ (5) ; }
void Door::complete(){ (6) ; }
class DoorState{
//定义一个抽象的状态,它是所有状态类的基类
protected: Door
*door;
public:
DoorState(Door *door) { this->door = door; }
virtual ~DoorState(void);
virtual void click() {}
virtual void complete() {}
virtual void timeout() {}
};
class DoorClosed :public
DoorState{ //定义一个基本的closed状态
public:
DoorClosed(Door
*door):DoorState(door) {}
virtual ~
DoorClosed (){}
void
click();
};
void DoorClosed::click() { (7) ; }
//其他状态类的定义与实现代码省略
iht
main(){
Door aDoor;
aDoor.getState(); aDoor.click();
aDoor.getState(); aDoor.complete();
aDoor.getState(); aDoor.timeout(); aDoor.getState();
return 0;
【问题2】
请用150字以内的文字简要说明【C++代码1】、【C++代码2】这两种对传输门进行状态模拟的设计思路的区别之处。 |
【参考答案】
代码2将状态间的转换规则封装到具体的类中,当状态转换图的转换规则发生变化时,只需更改部分对应类中的状态迁移规则,而代码1......
(↓↓↓ 点击下方‘点击查看答案’看完整答案 ↓↓↓)