• 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);
  • 相关阅读:
    MySQL LIMIT OFFSET
    Sublime Text 3安装清爽主题(著名的Soda Theme)
    MySQL无法远程连接解决方案
    算法题:李嘉诚保险柜密码问题
    一些不错的算法学习练习站点
    [转]MySQL远程连接ERROR 2003 (HY000):Can't connect to MySQL server on'XXXXX'(111) 的问题
    使用什么工具连接MySQL Server
    CentOS 7修改MySQL 5.6字符集为UTF-8
    CentOS 7 Minimal编译安装MySQL5.6
    如何使浏览器默认下载文件而不是打开文件
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/11173354.html
Copyright © 2020-2023  润新知