Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中带有枚举的自运行到完成状态机_Java_Design Patterns_Enums_State Machine - Fatal编程技术网

Java中带有枚举的自运行到完成状态机

Java中带有枚举的自运行到完成状态机,java,design-patterns,enums,state-machine,Java,Design Patterns,Enums,State Machine,在开发过程中,我需要设计一个带有决策的状态机,它运行到完成,并执行状态转换,而不需要等待事件。因此,我提出了下面的实现,我想与大家分享 因此,状态机使用以下枚举进行描述 public enum PnoBarringState { OPERATOR_WHITE_LIST_START { @Override public PnoBarringState nextState(SessionData sessionData, String pnoValue) { if

在开发过程中,我需要设计一个带有决策的状态机,它运行到完成,并执行状态转换,而不需要等待事件。因此,我提出了下面的实现,我想与大家分享

因此,状态机使用以下枚举进行描述

public enum PnoBarringState {
  OPERATOR_WHITE_LIST_START {
    @Override
    public PnoBarringState nextState(SessionData sessionData, String pnoValue) {
        if (commonMethods.isMatchingOperatorsWhiteList(sessionData, pnoValue)) {
            return GROUP_WHITE_LIST;
        } else {
            return OPERATOR_BLACK_LIST;
        }
    }
  },
  GROUP_WHITE_LIST {
    @Override
    public PnoBarringState nextState(SessionData sessionData, String pnoValue) {
        if (commonMethods.isMatchingGroupsWhiteList(sessionData, pnoValue)) {
            return PNO_CHECK_FINISHED;
        } else {
            return GROUP_BLACK_LIST;
        }
    }
  },
  OPERATOR_BLACK_LIST {
    @Override
    public PnoBarringState nextState(SessionData sessionData, String pnoValue) {
        if (commonMethods.isMatchingOperatorsBlackList(sessionData, pnoValue)) {
            return PNO_FORBIDDEN_NUMBER_OPERATOR_LEVEL;
        } else {
            return GROUP_WHITE_LIST;
        }
    }
  },
  GROUP_BLACK_LIST {
    @Override
    public PnoBarringState nextState(SessionData sessionData, String pnoValue) {
        if (commonMethods.isMatchingGroupsBlackList(sessionData, pnoValue))
            return PNO_FORBIDDEN_NUMBER_GROUP_LEVEL;
        else {
            return PNO_CHECK_FINISHED;
        }
    }
  },
  PNO_CHECK_FINISHED {
    @Override
    public PnoBarringState nextState(SessionData sessionData, String pnoValue) {
        return this;
    }

    @Override
    public boolean hasNext() {
        return false;
    }
  },
  PNO_FORBIDDEN_NUMBER_OPERATOR_LEVEL {
    @Override
    public PnoBarringState nextState(SessionData sessionData, String pnoValue) {
        throw new CustomUncheckedException( "Operator Level Barring");
    }
  },
  PNO_FORBIDDEN_NUMBER_GROUP_LEVEL {
    @Override
    public PnoBarringState nextState(SessionData sessionData, String pnoValue) {
        throw new CustomUncheckedException("Group Level Barring");
    }
  };

  public abstract PnoBarringState nextState(SessionData sessionData, String pnoValue);

  public boolean hasNext() { return true; }
}
函数“nextState()”是抽象的,并在每个状态中实现,以便检查转换并返回到新状态。只有“结束”状态返回到相同的状态。 由于它也被设计用于完成运行,因此提供了“hasNext()”函数。“结束”状态正在覆盖,以便声明状态机的结束

然后,通过以下方式在普通应用程序代码中使用此枚举

PnoBarringState pnoBarringState = PnoBarringState.OPERATOR_WHITE_LIST_START;

while (pnoBarringState.hasNext()) {
    pnoBarringState = pnoBarringState.nextState(sessionData, pnoValue);
}
我不确定是否有任何模式以同样的方式描述它,但我很想分享它。
任何其他方法都被认为是有价值的。

这似乎是一个值得考虑的问题。