一、概述
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。
在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
二、模块
- 抽象状态 State。
- 上下文类 Context,它用于维护对象当前的状态,当上下文对象接收到外部请求时,它会使用当前状态对象所对应的行为。
- 具体状态xxxState,是对抽象状态的实现。
三、示例
例如一个程序的状态,有开始、运行、结束,不同的状态对应着不同的行为。
四、代码
第一步:创建抽象状态接口
public interface ProcedureState {
/**
* 状态接口
* Returns void
* @param context
*/
void process(ProcedureContext context);
}
第二步:创建具体状态类
public class ProcedureStart implements ProcedureState {
@Override
public void process(ProcedureContext context) {
System.out.println("心机之蛙,程序状态开始");
context.setProcedureState(new ProcedureRun());
}
}
public class ProcedureRun implements ProcedureState {
@Override
public void process(ProcedureContext context) {
System.out.println("心机之蛙,程序状态运行");
context.setProcedureState(new ProcedureStop());
}
}
public class ProcedureStop implements ProcedureState {
@Override
public void process(ProcedureContext context) {
System.out.println("心机之蛙,程序状态结束");
context.setProcedureState(new ProcedureStart());
}
}
第三步:创建上下文对象Context
public class ProcedureContext {
private ProcedureState procedureState;
public ProcedureContext() {
procedureState = new ProcedureStart();
}
public void setProcedureState(ProcedureState procedureState) {
this.procedureState = procedureState;
}
public void process() {
procedureState.process(this);
}
}
五、测试
public class ProcedureDemoTest {
public static void main(String[] args) {
ProcedureContext procedureContext = new ProcedureContext();
procedureContext.process();
procedureContext.process();
procedureContext.process();
}
}
输出结果:
心机之蛙,程序状态开始
心机之蛙,程序状态运行
心机之蛙,程序状态结束
六、思考与总结
状态模式适用场景 :
- 一个对象 , 存在多个状态 , 状态可以相互转换 ; 不同状态下 , 行为不同 ;
优点 :
- 可以将一个对象的不同状态隔离,保证每个状态都是一个单独的类,减少彼此的依赖。
- 便于扩展,增加新状态时,操作简单。
缺点 :
- 如果状态数量过多,对应的状态类就会增加,业务场景也会变得更复杂,会增加系统的复杂度以及理解难度。