Spring State Machine(状态机)入门
说起 Spring 状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring 状态机就是状态模式的一种实现,在介绍 Spring 状态机之前,让我们先来看看设计模式中的状态模式。
1、状态模式 状态模式的定义如下:
状态模式(State Pattern) 是一种行为型设计模式,它允许对象在内部状态发生变化时改变其行为。在状态模式中,一个对象的行为取决于其当前状态,而且可以随时改变这个状态。状态模式将对象的状态封装在不同的状态类中,从而使代码更加清晰和易于维护。当一个对象的状态改变时,状态模式会自动更新该对象的行为,而不需要在代码中手动进行判断和处理。
通常业务系统中会存在一些拥有状态的对象,而且这些状态之间可以进行转换,并且在不同的状态下会表现出不同的行为或者不同的功能,比如交通灯控制系统中会存在红灯、绿灯和黄灯,再比如订单系统中的订单会存在已下单、待支付、待发货、待收货等状态,这些状态会通过不同的行为进行相互转换,这时候在系统设计时就可以使用状态模式。
下面是 状态模式 的类图:
可以看到状态模式主要包含三种类型的角色:
上下文(Context):封装了状态的实例,负责维护状态实例,并将请求委托给当前的状态对象。
抽象状态(State):定义了表示不同状态的接口,并封装了该状态下的行为。所有具体状态都实现这个接口。
具体状态(Concrete State):具体实现了抽象状态角色的接口,并封装了该状态下的行为。
下面是使用状态模式实现 红绿灯 状态变更的一个简单案例:
抽象状态类:
/** * @description: 抽象状态类 */ public abstract class MyState { abstract void handler(); } 具体状态类 A:
/** * @description: 具体状态A */ public class RedLightState extends MyState{ @Override void handler() { System.out.println("红灯停"); } } 具体状态类 B:
/** * @description: 具体状态B */ public class GreenLightState extends MyState{ @Override void handler() { System.