设计模式与软考试题之状态模式(一)(二)

2014-11-24 11:20:16 · 作者: · 浏览: 16
tate(); aDoor.timeout(); aDoor.getState(); return 0;
}
试题七
阅读以下说明以及 Java程序,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
传输门是传输 系统中的重要装置。传输门具有 Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)、Closing(正在关闭)五种状态。触发状态的转换事件有 click、complete 和 timeout 三种。事件与其相应的状态转换如图7-1所示。
图7-1 传输门响应事件与其状态转换图
下面的【Java 代码 1】与【Java 代码 2】分别用两种不同的设计思路对传输门进行状态模拟,请填补代码中的空缺。
【Java代码 1】
public class Door {
//定义状态变量,用不同的整数表示不同状态
public static final int CLOSED = 1;
public static final int OPENING = 2;
public static final int OPEN = 3;
public static final int CLOSING = 4;
public static final int STAYOPEN = 5;
private int state = CLOSED;
private void setState(int state){this.state = state;} //设置传输门当前状态
public void getState() {
// 此处代码省略,本方法输出状态字符串,
// 例如,当前状态为 CLOSED 时,输出字符串为”CLOSED”
}
public void click() { //发生 click 事件时进行状态转换
if ((1) ) setState(OPENING);
else if ( (2) ) setState(CLOSING);
else if ((3) ) setState(STAYOPEN);
}
//发生 timeout 事件时进行状态转换
public void timeout() { if (state == OPEN) setState(CLOSING); }
public void complete() { //发生 complete 事件时进行状态转换
if (state == OPENING) setState(OPEN);
else if (state == CLOSING) setState(CLOSED);
}
public static void main(String [] args){
Door aDoor = new Door();
aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.complete(); aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.click(); aDoor.getState(); return;
}
}
【Java代码 2】
public class Door {
public final DoorState CLOSED = new DoorClosed(this);
public final DoorState OPENING = new DoorOpening(this);
public final DoorState OPEN = new DoorOpen(this);
public final DoorState CLOSING = new DoorClosing(this);
public final DoorState STAYOPEN = new DoorStayOpen(this);
private DoorState state = CLOSED;
//设置传输门当前状态
public void setState(DoorState state){ this.state = state;}
public void getState(){ //根据当前状态输出对应的状态字符串
System.out.println(state.getClass().getName());
}
public void click() { (4) ;}//发生 click 事件时进行状态转换
public void timeout() { (5) ;}//发生 timeout 事件时进行状态转换
public void complete() { (6) ;}//发生 complete 事件时进行状态转换
public static void main(String[] args){
Door aDoor = new Door();
aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.complete();
aDoor.getState(); aDoor.timeout(); aDoor.getState(); return;
}
}
public abstract class DoorState { //定义所有状态类的基类
protected Door door ;
public DoorState(Door door) {this.door = door;}
public void click() {} public void complete() {} public void timeout() {}
}
class DoorClosed extends DoorState{ //定义一个基本的 Closed 状态
public DoorClosed(Door door) { super(door); }
public void click() { (7) ; }
//该类定义的其余代码省略
}
//其余代码省略
------------------------------------------------------------------------------------------------------------------------------------------------------
解答:
本题前三空的难度不大,只要能够看懂状态图并读懂代码,正确填写应该没有太大问题,后四空略