状态模式 -- 用枚举实现
1. 状态枚举类
注:状态模式主要是为了分离各种状态可以操作的动作,将各个状态可以做的事情封装到每个状态中。
也可以将每个状态写成一个类来实现。用枚举更为紧凑一些。用类实现更为灵活,可以将CONTEXT注入到各个状态类中。
还可以在状态枚举中加入各种状态可以显示的按钮和菜单,提示前端进行页面控制。
@Slf4j
public enum State implements IState{
/**
* 新建状态
*/
NEW_BUILT("new"){
@Override
public State start() {
log.info("启动线程!启动后状态变为就绪");
return READY;
}
},
/**
* 就绪状态
*/
READY("ready"){
@Override
public State getCpu() {
log.info("就绪状态getCPU,变成运行状态");
return RUNNING;
}
},
/**
* 运行状态
*/
RUNNING("running"){
@Override
public State stop() {
log.info("当前状态stop后,变为dead状态");
return DEAD;
}
@Override
public State suspend() {
log.info("当前状态suspend后,变为阻塞状态");
return BLOCK;
}
},
/**
* 阻塞状态
*/
BLOCK("blocking"){
@Override
public State resume() {
log.info("当前状态经过resume后,变成就绪状态readyState");
return READY;
}
},
/**
* 死亡状态
*/
DEAD("dead");
private String stateName;
State(String stateName){
this.stateName = stateName;
}
@Override
public State start() {
log.info("当前状态,不可以start");
return null;
}
@Override
public State getCpu() {
log.info("当前状态,不可以getCpu");
return null;
}
@Override
public State stop() {
log.info("当前状态,不可以stop");
return null;
}
@Override
public State resume() {
log.info("当前状态,不可以resume");
return null;
}
@Override
public State suspend() {
log.info("当前状态,不可以suspend");
return null;
}
}
2. 状态接口
public interface IState {
    State start();
    State getCpu();
    State stop();
    State resume();
    State suspend();
}
3. 上下文,用于接收各种调用,切换状态
public class Context{
    private State state;
    public Context(){
        state = State.NEW_BUILT;
    }
    public void start() {
        State st = state.start();
        if (st!=null){
            this.state = st;
        }
    }
    public void getCpu() {
        State st = state.getCpu();
        if (st!=null){
            this.state = st;
        }
    }
    public void stop() {
        State st = state.stop();
        if (st!=null){
            this.state = st;
        }
    }
    public void resume() {
        State st = state.resume();
        if (st!=null){
            this.state = st;
        }
    }
    public void suspend() {
        State st = state.suspend();
        if (st!=null){
            this.state = st;
        }
    }
}
4. 调用情况
public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        context.start();
        context.getCpu();
        context.suspend();
        context.resume();
        context.getCpu();
        context.stop();
    }
}
                    
                
                
            
        
浙公网安备 33010602011771号