显然,这是有限状态机的情况,但最好是组合条件而不是为每个组合创建新条件。我不喜欢Wikipedia上用于状态模式的Java示例,因为州了解其他州,这在很多情况下都是没有意义的。该保持的轨道过渡表
从 状态,适用 条件(S) ,并 以 国家,帮助照顾这个问题的。
我的两分钱是面向对象的有限状态机。您可以在OO方面做一些改进,但这可以使您理解。
class Transition { State from; Set<Condition> conditions; State to;}class State { String state;}class Condition { String condition;}状态机可以用以上类型构造。没有错误检查,但是如果在某些情况下未找到下一个状态,则可能引发异常或类似情况。
class StateMachine { List<Transition> transitions; State current; StateMachine(State start, List<Transition> transitions) { this.current = start; this.transitions = transitions; } void apply(Set<Condition> conditions) { current = getNextState(conditions); } State getNextState(Set<Condition> conditions) { for(Transition transition : transitions) { boolean currentStateMatches = transition.from.equals(current); boolean conditionsMatch = transition.conditions.equals(conditions); if(currentStateMatches && conditionsMatch) { return transition.to; } } return null; }}并进行测试:
编辑 :根据您的评论,有更多的过渡和新状态:
State one = new State("one");State two = new State("two");State three = new State("three");Condition sunday = new Condition("Sunday");Condition raining = new Condition("Raining");Condition notSunday = new Condition("Not Sunday");Condition notRaining = new Condition("Not Raining");List<Transition> transitions = new ArrayList<Transition>();transitions.add(one, new Set(sunday), three);transitions.add(one, new Set(sunday), two); // <<--- Invalid, cant go to two and threetransitions.add(one, new Set(raining), three);transitions.add(one, new Set(sunday, raining), three);transitions.add(one, new Set(notSunday, notRaining), three);StateMachine machine = new StateMachine(one, transitions);System.out.print(machine.current); // "one"machine.apply(new Set(sunday, raining));System.out.print(machine.current); // "three使用状态机进行相当大的项目时,我经历过痛苦的经历。问题在于复合状态。就像您提到的复合条件(周日和下雨)一样,从技术上讲,可能会有复合状态,这些状态可以进一步分解为单位状态。在您的情况下可能会或可能不会,但仍然值得一提。如果是这种情况,最好修改经典的有限状态机,并使用一
组状态 而不是单个状态来表示from和to状态。如果您的N很大,这将有助于保持理智水平。想想hotmail文件夹和gmail标记。过渡表将显示为
Transition(Set<State> from, Set<Condition> conditions, Set<State> to)



