public class StatefulObjectDemo { private State state; public StatefulObjectDemo() { state = State.SUBMIT_APPLY; } public void performRequest(String checkCondition) { state = state.transition(checkCondition); } public static void main(String[] args) { StatefulObjectDemo theObject = new StatefulObjectDemo(); theObject.performRequest("arg1"); theObject.performRequest("arg2"); theObject.performRequest("arg3"); theObject.performRequest("arg4"); }}复制代码
输出:
员工提交请假申请单,同步流转到部门经理审批 参数 = arg1部门经理审批完成,同步跳转到HR进行审批 参数 = arg2HR完成审批,流转到结束组件, 参数 = arg3流程结束, 参数 = arg4复制代码
Java枚举有一个比较有趣的特性即它允许为实例编写方法,从而为每个实例赋予其行为 。实现也很简单,定义一个抽象的方法即可,这样每个实例必须强制重写该方法 。(见示例的transition方法)
▲状态模式实现的状态机
是什么
状态模式是编程领域特有的名词 , 是 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方法 。
推荐阅读
- Vue3 企业级优雅实战 - 组件库框架 - 4 组件库的 CSS 架构
- MindSpore Graph Learning
- MySQL 是怎么加行级锁的?为什么一会是 next-key 锁,一会是间隙锁,一会又是记录锁?
- 普宁流沙最有实力的人|普宁哪里有维修电脑
- 专的读音 专怎么读
- 手机怎么把QQ空间说说一次性全删掉(qq如何恢复删掉的说说)
- 怎么一次性删掉QQ空间里的全部说说(翻看以前qq空间的说说)
- 狗粮正确吃法(狗粮的多种吃法)
- 两三个月的吉娃娃怎样喂狗粮(吉娃娃两个月怎么喂食)
- 狗粮要怎么喂,需要开水泡开吗(开水泡狗粮的水要倒掉吗)