状态模式,定义:类内部变量(变化了)导致相关类的方法也会发生相关变化
写的时候记住口诀,状态》实现状态》持有状态
public abstract class State {
protected Context context;//为了实现状态切换,你不切换就不写了
abstract void handle();
abstract void nextState();
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
}
public class RedState extends State {
@Override
public void handle() {
System.err.println("红灯停车");
}
@Override
void nextState() {
context.setCurrentState(Context.GREEN_STATE);//红灯之后是绿灯
System.err.println("设置Green");
}
}
public class YellowState extends State{
@Override
public void handle() {
System.err.println("黄灯等一等");
}
@Override
void nextState() {
context.setCurrentState(Context.RED_STATE);//黄灯之后是红灯
System.err.println("设置Red");
}
}
public class GreenState extends State {
@Override
public void handle() {
System.err.println("绿灯通行");
}
@Override
void nextState() {
context.setCurrentState(Context.YELLOW_STATE);//绿灯之后是黄灯
System.err.println("设置yellow");
}
}
环境持有状态
public class Context {
//罗列所有状态
public static final RedState RED_STATE = new RedState();
public static final GreenState GREEN_STATE = new GreenState();
public static final YellowState YELLOW_STATE = new YellowState();
private State currentState;//当前状态
public State getCurrentState() {
return currentState;
}
public void setCurrentState(State currentState) {
this.currentState = currentState;
this.currentState.setContext(this);
}
public void doSomthing(){
currentState.handle();//不同的状态,导致处理方法不一样,多态原生也可以实现的
}
//这个是额外的方法,实现状态变化
public void nextState(){
currentState.nextState();
}
}
最后设置测试类测试
public class Client {
public static void main(String[] args) {
Context context = new Context();
context.setCurrentState(new GreenState());
context.doSomthing();//什么灯做什么事
context.nextState();//灯要跳转了
for (int i = 0; i < 5; i++) {
context.doSomthing();//什么灯做什么事
context.nextState();//灯要跳转了
}
}
}
网友评论