从图中可以看出状态模式有以下角色:
package state;
/**
*
*作者:alaric
*时间:2013-9-3下午10:12:05
*描述:抽象状态类
*/
public interface State {
public void change(Context context);
}
package state;
/**
*
*作者:alaric
*时间:2013-9-3下午10:12:27
*描述:实现状态类
*/
public class ConcreteStateA implements State {
@Override
public void change(Context context) {
System.out.println("this is ConcreteStateA");
context.setState(new ConcreteStateB());
}
}
package state;
/**
*
*作者:alaric
*时间:2013-9-3下午10:13:02
*描述:实现状态类
*/
public class ConcreteStateB implements State {
@Override
public void change(Context context) {
System.out.println("this is ConcreteStateB");
context.setState(new ConcreteStateA());
}
}
package state;
/**
*
*作者:alaric
*时间:2013-9-3下午10:13:20
*描述:环境角色类
*/
public class Context {
private State state;
public void change(){
state.change(this);
}
public Context(State state) {
super();
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
package state;
/**
*
*作者:alaric
*时间:2013-9-3下午10:13:37
*描述:测试类
*/
public class Client {
/**
*作者:alaric
*时间:2013-9-3下午7:52:05
*描述:
*/
public static void main(String[] args) {
State state = new ConcreteStateA();
Context context = new Context(state);
//初始状态是A
context.change();
//装换一次后变成B
context.change();
//再转换一次后又变成A
context.change();
}
}
运行结果如下:
模拟代码如下:
package state.example;
/**
*
*作者:alaric
*时间:2013-9-7上午11:14:32
*描述:抽象状态类
*/
public interface State {
public void change(Light light);
}
package state.example;
public class GreenState implements State {
private static final Long SLEEP_TIME = 2000L;
@Override
public void change(Light light) {
System.out.println("现在是绿灯,可以通行");
//绿灯亮1秒
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
light.setState(new YellowState());
}
}
package state.example;
public class YellowState implements State {
private static final Long SLEEP_TIME = 500L;
@Override
public void change(Light light) {
System.out.println("现在是黄灯,警示");
//红灯亮0.5秒
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
light.setState(new RedState());
}
}
package state.example;
public class RedState implements State {
private static final Long SLEEP_TIME = 1000L;
@Override
public void change(Light light) {
System.out.println("现在是红灯,禁止通行");
//红灯亮1秒
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
light.setState(new GreenState());
}
}
package state.example;
public class Light {
private State state;
private void change(){
state.change(this);
}
public void work(){
while(true){
change();
}
}
public Light(State state) {
super();
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
package state.example;
/**
*
*作者:alaric
*时间:2013-9-7上午11:27:41
*描述:测试客户端
*/
public class Client {
/**
*作者:alaric
*时间:2013-9-7上午11:27:34
*描述:
*/
public static void main(String[] args) {
//假设路灯开始是绿灯
State state = new GreenState();
Light light = new Light(state);
light.work();
}
}
运行结果: