设计模式之状态模式19
背景
项目中会遇到各种各样的状态流转,比如,电梯的“打开”,“关闭”,“运行”,“停止”状态。同一时刻只会有一个状态。例如,打开状态,可以打开,关闭,而不能运行和停止。如果正常的写法,将会写很多的switch来判断。
我们用状态模式来实现一下。
类图
代码实现
先把四个状态抽象一下。
/**
* 状态的抽象
* @author ChenLisong
*
*/
public abstract class LiftState {
//上下文,控制状态的调用
protected Context context;
public void setContext(Context _context) {
this.context = _context;
}
//打开电梯
public abstract void open();
//关闭电梯
public abstract void close();
//运行电梯
public abstract void run();
//停止电梯
public abstract void stop();
}
打开状态对象
/**
* 打开状态,由状态本身来控制本身状态是否允许眺往别的状态
* @author ChenLisong
*
*/
public class OpenState extends LiftState {
//打开状态,可以执行打开
public void open() {
System.out.println("lift open ...");
}
//可以执行关闭状态,先设置上下文中的当前状态是关闭,然后执行关闭的方法,打印信息
public void close() {
super.context.setLiftState(Context.closeState);
super.context.getLiftState().close();
}
//不能跳往运行状态
public void run() {
//do nothing
}
//不能眺往停止状态
public void stop() {
//do nothing
}
}
关闭状态
public class CloseState extends LiftState {
public void open() {
super.context.setLiftState(Context.openState);
super.context.getLiftState().open();
}
public void close() {
System.out.println("lift close ...");
}
public void run() {
super.context.setLiftState(Context.runState);
super.context.getLiftState().run();
}
public void stop() {
super.context.setLiftState(Context.stopState);
super.context.getLiftState().stop();
}
}
运行状态
public class RunState extends LiftState {
public void open() {
//do nothing
}
public void close() {
//do nothing
}
public void run() {
System.out.println("lift run ...");
}
public void stop() {
super.context.setLiftState(Context.stopState);
super.context.getLiftState().stop();
}
}
关闭状态
public class StopState extends LiftState {
public void open() {
super.context.setLiftState(Context.openState);
super.context.getLiftState().open();
}
public void close() {
super.context.setLiftState(Context.closeState);
super.context.getLiftState().close();
}
public void run() {
//do nothing
}
public void stop() {
System.out.println("lift stop...");
}
}
定义调用状态的上下文
/**
* 调用各个状态的上下文
* @author ChenLisong
*
*/
public class Context {
//存储各个状态
public static final OpenState openState = new OpenState();
public static final CloseState closeState = new CloseState();
public static final RunState runState = new RunState();
public static final StopState stopState = new StopState();
//保存当前的状态值
public LiftState liftState;
//因为状态更新而设置新的状态值
public void setLiftState(LiftState liftState) {
this.liftState = liftState;
this.liftState.setContext(this);
}
//获取当前状态进行操作
public LiftState getLiftState() {
return this.liftState;
}
//打开操作
public void open() {
this.liftState.open();
}
//关闭操作
public void close() {
this.liftState.close();
}
//运行
public void run() {
this.liftState.run();
}
//关闭
public void stop() {
this.liftState.stop();
}
}
客户端调用
public class Client {
public static void main(String[] args) {
//设置状态调用的上下文
Context context = new Context();
//设置起始状态是关闭状态
context.setLiftState(new CloseState());
context.open();
context.close();
context.run();
context.stop();
//这个不应该被执行,因为停止状态不能到达运行状态,得先执行close
context.run();
}
}
运行结果
lift open ...
lift close ...
lift run ...
lift stop...