前言
Lab3中需要使用状态模式来控制一个计划项的运行状态,并且在五个应用中总共有两类状态转换图(状态机)。因为有一些状态是重叠的,因此可以将他们共享,二选一,我采用布尔变量控制,但是状态模式的基本“套路”还是没有变的。
模式结构
状态模式包含以下主要角色。
- 环境(Context)角色:也称为上下文,它定义了客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。
- 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为。
- 具体状态(Concrete State)角色:实现抽象状态所对应的行为。
可以结合具体代码对照,State实际上被定义为一个抽象类,这个抽象类中应该包括状态机中各种状态的一些共有属性,比如“状态名”。
Concrete State 对应位State的一些具体实现类,来定义状态机中所需要的状态类。
而环境Context,不如说是状态机,前两者提供了这个“机器”的一些零件,但实际的运转却需要将这些零件组合起来。
你也可以看到,具体类的创建(或者说状态转换的一个操作)是直接new 一个对应的状态类的,这个有点像工厂模式。
代码中的状态转换图:
package Resource;
//状态机
public class StateMachine
{
private State state;
private boolean type;//true代表第二种
//构造函数,初始为wait
public StateMachine(boolean type)
{
state=new WAITING();
// System.out.println(state.stateName);
this.type=type;
}
public void setState(State state)
{
this.state=state;
}
public State getState()
{
return state;
}
public String getStateName(){
return state.stateName;
}
public boolean allocate()
{
if(state.stateName.equals("未分配状态")){
((WAITING) state).allocate(this);
// System.out.println(state.stateName);
return true;
}else
return false;
}
public boolean run()
{
if(state.stateName.equals("已分配状态")){
((ALLOCATED) state).run(this);
// System.out.println(state.stateName);
return true;
}else