模式中的角色:
State:抽象状态角色
ConcreteState:具体状态角色
Context:环境角色
状态模式通用类图如下
具体的类图如下
代码实现如下:
package state2;
/**
* Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。
*
*/
public class Context {
private State state;
/**
* 定义Context的初始状态
* @param state
*/
public Context(State state) {
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
/**
* 对请求做处理,并设置下一个状态
*/
public void request(){
state.handle(this);
}
}
package state2;
/**
* 抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为
*
*/
public abstract class State {
public abstract void handle(Context context);
}
package state2;
/**
* 具体状态类,每一个子类实现一个与Context的一个状态相关的行为
*
*/
public class ConcreteStateA extends State {
/**
* 设置ConcreteStateA的下一个状态是ConcreteStateB
*/
@Override
public void handle(Context context) {
System.out.println("当前状态为:A");
context.setState(new ConcreteStateB());
}
}
package state2;
/**
* 具体状态类,每一个子类实现一个与Context的一个状态相关的行为
*/
public class ConcreteStateB extends State {
/**
* 设置ConcreteStateB的下一个状态是ConcreteSateA
*/
@Override
public void handle(Context context) {
System.out.println("当前状态为:B");
context.setState(new ConcreteStateA());
}
}
客户端调用:
package state2;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// 设置Context的初始状态为ConcreteStateA
Context context = new Context(new ConcreteStateA());
// 不断地进行请求,同时更改状态
context.request();
context.request();
context.request();
context.request();
}
}