设计模式(Design pattern)之状态模式(state Pattern)
状态模式在电梯系统中的应用 该代码展示了状态模式在电梯控制系统中的实现。通过抽象StateElevator类定义四种操作(open/close/run/stop),并由四个具体状态类(Open/Run/Stop/Close)实现不同状态下的行为逻辑。Context类作为环境角色维护当前状态,各状态类可通过super.context改变状态。这种设计避免了大量条件判断,使状态转换清晰可见,但实际应用
·
状态模式,最常用的模式之一,也是最不好落地的模式 —— 遇到状态调整几乎重写所有代码。
先看代码
状态模式抽象类
/**
* 状态模式 - 抽象类
* @version 0.1
* @author BaiJing.biz
*/
public abstract class StateElevator {
// 声明环境角色
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();
}
环境类
/**
* 状态模式 - 环境类
* @version 0.1
* @author BaiJing.biz
*/
public class Context {
// 和状态对象对应的常量
public final static Open OPEN_STATE = new Open();
public final static Run RUN_STATE = new Run();
public final static Stop STOP_STATE = new Stop();
public final static Close CLOSE_STATE = new Close();
// 当前「状态」变量
private StateElevator stateElevator;
public StateElevator getStateElevator() {
return stateElevator;
}
public void setStateElevator(StateElevator stateElevator) {
this.stateElevator = stateElevator;
// 设置 Context
this.stateElevator.setContext(this);
}
public void open(){
this.stateElevator.open();
}
public void close(){
this.stateElevator.close();
}
public void run(){
this.stateElevator.run();
}
public void stop(){
this.stateElevator.stop();
}
}
状态类的实例
/**
* 状态模式 - 抽象类 : 开启状态类
* @version 0.1
* @author BaiJing.biz
*/
public class Open extends StateElevator {
@Override
public void open() {
System.out.println("OPEN 电梯开启.");
}
@Override
public void close() {
super.context.setStateElevator(Context.CLOSE_STATE);
super.context.close();
}
@Override
public void run() {
// 开启,无法运行;无动作
}
@Override
public void stop() {
// 开门状态,本身就是停止的;无动作
}
}
/**
* 状态模式 - 抽象类 : 运行状态类
* @version 0.1
* @author BaiJing.biz
*/
public class Run extends StateElevator {
@Override
public void open() {
// 无动作
}
@Override
public void close() {
// 无动作
}
@Override
public void run() {
System.out.println("RUN 电梯运行中。 run()");
}
@Override
public void stop() {
super.context.setStateElevator(Context.STOP_STATE);
super.context.getStateElevator().stop();
}
}
/**
* 状态模式 - 抽象类 : 停止状态类
* @version 0.1
* @author BaiJing.biz
*/
public class Stop extends StateElevator {
@Override
public void open() {
super.context.setStateElevator(Context.OPEN_STATE);
super.context.getStateElevator().open();
}
@Override
public void close() {
super.context.setStateElevator(Context.CLOSE_STATE);
super.context.getStateElevator().close();
}
@Override
public void run() {
super.context.setStateElevator(Context.RUN_STATE);
super.context.getStateElevator().run();
}
@Override
public void stop() {
System.out.println("STOP 电梯停止中。 stop()");
}
}
super.context.getStateElevator().run(); // 其它主体操作
和
super.context.close(); // 主动操作
/**
* 状态模式 - 抽象类 : 关闭状态类
* @version 0.1
* @author BaiJing.biz
*/
public class Close extends StateElevator {
@Override
public void open() {
super.context.setStateElevator(Context.OPEN_STATE);
super.context.open();
}
@Override
public void close() {
System.out.println("CLOSE 电梯门关闭。 close()");
}
@Override
public void run() {
super.context.setStateElevator(Context.RUN_STATE);
super.context.run();
}
@Override
public void stop() {
super.context.setStateElevator(Context.STOP_STATE);
super.context.stop();
}
}
客户
public class CustomerRun {
public static void main(String[] args) {
Context context = new Context();
context.setStateElevator(new Open());
context.run();
context.open();
context.close();
context.stop();
}
}
更多推荐



所有评论(0)