▲状态模式实现的状态机
是什么
状态模式是编程领域特有的名词 , 是 23 种设计模式之一 , 属于行为模式的一种 。
它允许一个对象在其内部状态改变时改变它的行为 。对象看起来似乎修改了它的类 。
作用状态模式的设计意图主要是为了解决两个主要问题:
- 当一个对象的内部状态改变时 , 它应该改变它的行为 。
- 应独立定义特定于状态的行为 。也就是说 , 添加新状态不应影响现有状态的行为 。

文章插图
类图
定义一个State接口 , 它可以有N个实现类 , 每个实现类需重写接口State定义的handle方法 。它还有一个Context上下文类 , 内部持有一个State对象引用 , 外部状态发生改变(构造器内传入不同实现类) , 最终实现类自身行为动作也接着改变(实现类调用其自身的handle方法) 。
Context示意图参考

文章插图

文章插图
用状态模式实现的代码示例:
public interface SwitchState { void handle();}public class TurnOffAction implements SwitchState{ @Override public void handle() { System.out.println("关灯"); }}public class TurnOnAction implements SwitchState{ @Override public void handle() { System.out.println("开灯"); }}public class Context { private SwitchState state; public Context(SwitchState state){ this.state=state; } public void doAction(){ state.handle(); }}复制代码输出public class StatePatternDemo { @DisplayName("状态模式测试用例-开灯") @Test public void turnOn() { Context context = new Context(new TurnOnAction()); context.doAction(); }输出:开灯 @DisplayName("状态模式测试用例-关灯") @Test public void turnOff() { Context context = new Context(new TurnOffAction()); context.doAction(); }}输出:关灯复制代码大家看下这段示例代码:Context类有一个有参构造方法 , 参数类型是State , 所以实例化对象的时候你可以传入State的不同的实现类 。最终context.doAction()调用的是不同实现类的doAction方法 。▲开源实现
目前开源的状态机实现方案有spring-statemachine、squirrel-foundation、sateless4j等 。其中spring-statemachine、squirrel-foundation在github上star和fock数稳居前二 。
不过这些状态机普通使用下来普遍存在两个问题:
问题一:太复杂
因为基本囊括了UML State Machine上列举的所有功能 , 功能是强大了 , 但也搞得体积过于庞大、臃肿、很重 。很多功能实际生产场景中根本用不到 。
经验总结扩展阅读
- 如何快速减脂 如何快速减脂增肌
- Vue3 企业级优雅实战 - 组件库框架 - 4 组件库的 CSS 架构
- 2022年农历十月三十是乔迁的最佳吉日吗
- 篮球锻炼腿部肌肉的方法 篮球腿部训练方法
- MindSpore Graph Learning
- 提臀最快最好方法 提臀最快的方法
- 蝴蝶机夹胸的正确做法 蝴蝶机夹胸怎么做
- 运动量大的人具体吃什么 运动量大的人多吃什么
- 做减肥豆芽汤窍门 减肥豆芽汤的做法
- MySQL 是怎么加行级锁的?为什么一会是 next-key 锁,一会是间隙锁,一会又是记录锁?
