状态机的技术选型,yyds!( 二 )

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 种设计模式之一 , 属于行为模式的一种 。
它允许一个对象在其内部状态改变时改变它的行为 。对象看起来似乎修改了它的类 。
作用状态模式的设计意图主要是为了解决两个主要问题:

  1. 当一个对象的内部状态改变时 , 它应该改变它的行为 。
  2. 应独立定义特定于状态的行为 。也就是说,添加新状态不应影响现有状态的行为 。
类图:
状态机的技术选型,yyds!

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

文章插图

状态机的技术选型,yyds!

文章插图
用状态模式实现的代码示例:
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方法 。

推荐阅读