Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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_State Pattern - Fatal编程技术网

Java 处理状态转换的模式

Java 处理状态转换的模式,java,state-pattern,Java,State Pattern,我正在设计一款游戏,它可以在几个状态之间转换,我看到了两种模式,一种是: 1) 枚举模式,其中: static { // standard states transitions.put(PHASE 1, new State[]{PHASE2, PHASE3, PHASE4}); 2) 类中的状态模式,其中有一个抽象,以及扩展抽象并表示每个状态的子类。。单一国家模式 我在这两者之间有点纠结,两者看起来都是很好的解决方案,对于一个游戏来说,什么更干净,更容易理解 就我个人而言,我喜

我正在设计一款游戏,它可以在几个状态之间转换,我看到了两种模式,一种是:

1) 枚举模式,其中:

static {
    // standard states
    transitions.put(PHASE 1, new State[]{PHASE2, PHASE3, PHASE4});
2) 类中的状态模式,其中有一个抽象,以及扩展抽象并表示每个状态的子类。。单一国家模式

我在这两者之间有点纠结,两者看起来都是很好的解决方案,对于一个游戏来说,什么更干净,更容易理解


就我个人而言,我喜欢monostate,但enum方法似乎是最好的选择。

我不推荐这两种方法。编写一个有限状态机,并将状态和转换外部化为XML或JSON。这将是一个更加灵活的设计

我都不推荐。编写一个有限状态机,并将状态和转换外部化为XML或JSON。这将是一个更加灵活的设计

这取决于您是否需要在状态中存储任何业务逻辑。第二种选择可能使这更容易。你们所有的州都可以实施以下措施:

interface State {
    State transition(Event event);
}
然后,您可以使用一种管理器类来管理转换:

class StateManager {
    State actualState = new BaseState();
    void processEvent(Event event) {
        actualState = actualState.transition(event);
    }
}
您的
状态实现
然后根据输入选择并返回下一个状态

您基本上实现了一个有限状态机


如果你的机器很容易很快变得复杂,你应该像@duffymo所说的那样,将转换外部化。我确信有一些库可以做到这一点,尽管我不知道有哪个库的名字。

这取决于您是否需要在状态中存储任何业务逻辑。第二种选择可能使这更容易。你们所有的州都可以实施以下措施:

interface State {
    State transition(Event event);
}
然后,您可以使用一种管理器类来管理转换:

class StateManager {
    State actualState = new BaseState();
    void processEvent(Event event) {
        actualState = actualState.transition(event);
    }
}
您的
状态实现
然后根据输入选择并返回下一个状态

您基本上实现了一个有限状态机

如果你的机器很容易很快变得复杂,你应该像@duffymo所说的那样,将转换外部化。我确信有一些库可以做到这一点,尽管我不知道有哪个库的名字。

至于“更干净的代码”,这是一个选择的问题

一些需要考虑的事情

如果添加另一个状态和N个转换,代码会发生什么变化?您和团队中的其他开发人员是否仍然可以阅读?尝试达成某种共识,或者将其体现在代码风格的指导方针中

IMHO,由于您使用的语言是面向对象的,我将使用GOF书籍中的状态模式,因为它利用了封装和多态性

如果你是用C写的,我会选择表驱动的方法

至于“更干净的代码”,这是一个选择问题

一些需要考虑的事情

如果添加另一个状态和N个转换,代码会发生什么变化?您和团队中的其他开发人员是否仍然可以阅读?尝试达成某种共识,或者将其体现在代码风格的指导方针中

IMHO,由于您使用的语言是面向对象的,我将使用GOF书籍中的状态模式,因为它利用了封装和多态性


如果你是用C写的,我会选择表驱动的方法

OP似乎在询问如何编写有限状态机。您还提到以文本格式持久化状态-为什么这很重要?特别是如果这是一个游戏,也许是一个实时模拟。状态大概只需要在内存中,并快速更新。我看到了enum和子类-这不是我推荐的。我说的是将配置外部化,不要以这种方式将其放在代码中。在启动时将其读入内存并使用。这已经足够快了。FSM是一个足够通用的概念,您可以将其配置为通用的。您可以更新您的答案,说“外部化配置”,然后该注释将是准确的!:)您没有看到“将状态和转换外部化为XML或JSON”这个词吗?这正是我说的。OP似乎在问如何编写有限状态机。您还提到以文本格式持久化状态-为什么这很重要?特别是如果这是一个游戏,也许是一个实时模拟。状态大概只需要在内存中,并快速更新。我看到了enum和子类-这不是我推荐的。我说的是将配置外部化,不要以这种方式将其放在代码中。在启动时将其读入内存并使用。这已经足够快了。FSM是一个足够通用的概念,您可以将其配置为通用的。您可以更新您的答案,说“外部化配置”,然后该注释将是准确的!:)您没有看到“将状态和转换外部化为XML或JSON”这个词吗?这正是我所说的。你想要实现的看起来像是战略/状态模式。我正在设计一个游戏,游戏只需要经历不同的状态,如开始游戏、结束游戏等等。。我在看一个模式,如果你对状态模式感兴趣,这里有一个很有价值的大纲。然而,如果您对表驱动方法感兴趣,Bob Martin的书《C#中的敏捷原则、模式和实践》中也有表驱动方法的实现。祝你好运你想要实现的看起来像是策略/状态模式。我正在设计一个游戏,这个游戏只需要经历不同的状态,如开始游戏、结束游戏等等。。我在看一个模式,如果你对状态模式感兴趣,这里有一个很有价值的大纲。然而,如果您对表驱动方法感兴趣,Bob Martin的书《C#中的敏捷原则、模式和实践》中也有表驱动方法的实现。祝你好运+1对于表驱动方法。这在Java中也值得考虑。我更喜欢任何能保持健康的东西