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);
  • 相关阅读:
    vs2015连接oracle 11g(.net自带方式 using System.Data.OracleClient;)
    div层叠顺序额
    linux运维、架构之路-Zabbix自动化
    linux运维、架构之路-Zabbix监控
    linux运维、架构之路-keepalived高可用
    linux运维、架构之路-内网NTP时间服务器
    linux运维、架构之路-Nginx反向代理
    linux运维、架构之路-数据库迁移
    linux运维、架构之路-网络基础
    linux运维、架构之路-shell编程(一)
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/11173354.html
Copyright © 2011-2022 走看看