zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    Hibernate关系映射(一) 基于外键的单向一对一
    Hibernate开发环境搭建
    Java创建和读取Json
    Json 简易教程
    jQuery Validate验证框架详解
    asp.net Core 3.1配置log4net
    HTTP 错误 500.21
    SQL中数据库 无法访问,并且数据库的属性中 使用人数、大小、可用空间全是不可用
    What is a CGFloat?
    Swift中的CGPoint ,CGSize 、CGRect、CGFloat
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/11173354.html
Copyright © 2011-2022 走看看