栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

涉及N个状态及其之间的转换的设计模式问题

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

涉及N个状态及其之间的转换的设计模式问题

显然,这是有限状态机的情况,但最好是组合条件而不是为每个组合创建新条件。我不喜欢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)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407082.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号