设计模式研究

状态模式

2020-08-03  本文已影响0人  Stephenwish
状态模式,定义:类内部变量(变化了)导致相关类的方法也会发生相关变化

写的时候记住口诀,状态》实现状态》持有状态

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();//灯要跳转了
        }
    }
}

上一篇下一篇

猜你喜欢

热点阅读