【问题标题】:Transition methods in state design pattern状态设计模式中的转换方法
【发布时间】:2011-03-02 04:49:12
【问题描述】:

我有一个状态机有许多状态A--B--C--D--E。如果某些条件得到验证,我有很多从CA 的转换。对于每个状态,我都有一个扩展抽象类 State 的类,并且我有一个将每个转换方法委托给状态方法的管理器。问题是“国家可以直接调用经理转换方法吗?”。我在 Internet 上只看到过一个示例,其中有一个主类确切地知道转换发生了多少次(即insertQuarter()ejectQuarter()turnCrank()dispense())。 我发现这样做的唯一方法是在状态中调用管理器转换方法。这是错误的做法还是不好的做法?

提前致谢 托比亚

【问题讨论】:

    标签: java design-patterns state-pattern


    【解决方案1】:

    是的...至少如果我正确理解了您的问题。 管理器必须保留对当前状态的引用,因此当前状态必须能够要求管理器移动到下一个当前状态。以Wikipedia example 为例。

    【讨论】:

    • 我可以要求经理移动到另一个状态,将当前状态设置为下一个状态......但是如何激活下一个状态?在 wiki 示例中,没有我的情况。如果我将 stateContext.writeName(String name) 放入其中一种状态的 writeName 方法中(设置后),那将是相同的
    • 您不会“激活”下一个状态。切换到它意味着告诉管理器(上下文)它的状态现在是 NextState。当上下文需要执行某些操作时,它会通过方法的实现将其委托给其状态。
    【解决方案2】:

    如果您需要一个简单的同步状态机,在任何给定时间点最多执行一次,我正在考虑的模型如下:

    1) 执行的上下文由 Context 对象表示。上下文在状态之间传递,并用于管理器的流决策。上下文的 API 取决于您需要系统的通用程度。

    2) 状态接口包含执行(上下文)方法,具体逻辑发生在该方法中。允许使用和更改上下文数据。

    3) 管理器配置了转换规则。给定最后一个状态和上下文,它能够确定下一个要执行的状态。它从执行初始状态开始。每次执行状态 S 后,它都会根据与状态 S 关联的转换规则检查上下文对象。当它到达终端状态时,流程结束。

    通过这种设计,状态实现不会以任何方式了解管理器,也不会参与路由决策。

    【讨论】:

    • 但是根据您的建议,不使用状态模式,因为状态不决定下一个状态。对吗?
    • @Matroska:据我所知,状态设计模式的想法是存储对某些执行机制的引用,并将命令委托给它。当需要改变行为时,可以随时更换执行器。在我提出的设计中,我相信管理器使用了该模式,因为它存储了对当前状态的引用,并在每次转换后更改此引用。
    • @Matroska:我同意我的方法与 Wikiperia 的示例不同。但是,我认为这是实现状态机的一种更简洁的方式。各州不必相互了解。
    • 我开始认为没有其他更清洁的方法了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2017-02-26
    相关资源
    最近更新 更多