状态模式 -- 用枚举实现

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();
}
}



猜你喜欢

转载自www.cnblogs.com/modestlin/p/12400756.html