• java版的状态机实现


    状态机适用场景:

    C的操作,需要等到A、B的两个操作(A、B顺序操作),那就需要在 A、B之间创建一个状态机(state machine),C的操作需要状态机达到某一个状态才能进行

    1. Overview

    java版的状态机的原理其实就是java中的枚举类Enum,所以在进行状态机设计之前,先学习一下(回顾一个java Enum)

    2. Java Enums

    一个简单的例子:员工请假系统,员工到HR那离(submitted)-> 部门领导(Escalated) -> 部门经理(Approved)

    public enum LeaveRequestState {
        Submitted,
        Escalated,
        Approved
    }

    我们可以这样引用:

    LeaveRequestState state = LeaveRequestState.Submitted;
     java的枚举也可以包含方法,我们可以在枚举类中写一个抽象方法(abstract),这样枚举类中的每个成员都会继承该方法,这个就是java版状态机的核心所在
    public enum LeaveRequestState {
        Submitted {
            @Override
            public String responsiblePerson() {
                return "Employee";
            }
        },
        Escalated {
            @Override
            public String responsiblePerson() {
                return "Team Leader";
            }
        },
        Approved {
            @Override
            public String responsiblePerson() {
                return "Department Manager";
            }
        };
     
        public abstract String responsiblePerson();
    }

    注意上面的逗号,以及抽象方法前的分号

     

    在下面的例子中, 我们使用上面代码中的 responsiblePerson() 方法. 这就是一个典型的状态机. 我们想知道"Escalated "的“状态”(实际是审批人), 那就会返回结果 “Team Leader”:

    LeaveRequestState state = LeaveRequestState.Escalated;
    assertEquals("Team Leader", state.responsiblePerson());

    同样的  “Department Manager”:

    LeaveRequestState state = LeaveRequestState.Approved;
    assertEquals("Department Manager", state.responsiblePerson());

    3. State Machines

    状态机又称有限状态机,是一个建立在抽象机器上的计算模型,这个状态机在给定的时间内,只能有一个状态,而每一个状态又可以转换为其他状态(其他状态也是我们自己定义的)

    4. Enums as State Machines

    public enum LeaveRequestState {
     
        Submitted {
            @Override
            public LeaveRequestState nextState() {
                return Escalated;
            }
     
            @Override
            public String responsiblePerson() {
                return "Employee";
            }
        },
        Escalated {
            @Override
            public LeaveRequestState nextState() {
                return Approved;
            }
     
            @Override
            public String responsiblePerson() {
                return "Team Leader";
            }
        },
        Approved {
            @Override
            public LeaveRequestState nextState() {
                return this;
            }
     
            @Override
            public String responsiblePerson() {
                return "Department Manager";
            }
        };
     
        public abstract LeaveRequestState nextState(); 
        public abstract String responsiblePerson();
    }
    LeaveRequestState state = LeaveRequestState.Submitted;
     
    state = state.nextState();
    assertEquals(LeaveRequestState.Escalated, state);
     
    state = state.nextState();
    assertEquals(LeaveRequestState.Approved, state);
     
    state = state.nextState();
    assertEquals(LeaveRequestState.Approved, state);
  • 相关阅读:
    HDU 5045 5047 5050 5053(上海网络赛E,F,I,L)
    Xcode 5、Xcode 6 免证书真机调试
    Ubuntu打开终端的方法三种
    JAVA异常处理机制
    Java多线程之~~~~synchronized 方法
    iphone开发技术要学习的内容
    表达式求值(数据结构书上栈的应用之中的一个)
    Java学习篇之---json-lib(Maven)
    Nginx 笔记与总结(16)nginx 负载均衡
    SPSS数据记录的选择(Select Cases)
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/11173354.html
Copyright © 2020-2023  润新知