前言
作者更有一系列设计模式文章(还在持续更新),图例丰富,少量代码,适合入门,系列文章见末尾跳转
一、状态模式定义
状态模式:提供一种一对多的转化设计,当对象状态发生转变时,能够动态修改对象功能,使得对象状态变更。
可以通过状态转化图的形式表示:
状态转化图:通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。
- 此外状态转换图还指明了作为特定事件的结果系统将做哪些动作(例如,处理数据),因此状态转换图提供了行为建模机制。
- 在状态转换图中,每一个节点代表一个状态,其中双圈是终结状态。
以电梯状态变化为例子:
- 电梯在关闭时,可以运行电梯到达运行状态,也可以在运行前再次停止(刷新状态),也可以打开电梯门。
- 在开启时,不能直接运行,开启时只可能为停止下的开启,开门状态下可以关门。
- 停止状态(来自关门状态),可以开门,也可以运行。
- 运行状态,只能通过停止来转变状态
二、状态模式的结构
- State/StateA…:状态定义类,支持各个状态下的行为。
- Context: 状态保存类,保存当前状态信息,可以修改状态,运行当前状态下的行为。
class User{
public static void main(String[] args){
Context context=new Context();
context.setState(new StateA());
//当前在状态A
context.request("输出A状态的行为")
//当前执行的StateA的处理函数
context.setState(new StateB());
//修改为状态B
context.request("输出B状态的行为")
//当前执行的StateB的处理函数
}
}
按照上面电梯的例子,通过在状态内部函数执行时修改状态(为了简单只实现开关转换):
abstract class State{
protected Context context;//需要在状态中转换状态
public setContext