状态设计模式中的转换方法

5
我有一个状态机,有许多状态 A--B--C--D--E。例如,如果某个条件得到验证,我有许多从 CA 的转换。对于每个状态,我都有一个继承抽象类 State 的类,并且我有一个管理器将每个转换方法委托给状态方法。问题是“状态能否直接调用管理器的转换方法?”我在互联网上只看到过一些示例,其中有一个主要类确切地知道转换发生的次数(例如insertQuarter()ejectQuarter()turnCrank()dispense())。 我找到的唯一方法是在状态中调用管理器的转换方法。这是错误或不好的做法吗?
2个回答

3
如果您需要一个简单的同步状态机,在任何给定时间点最多只有一个执行,我考虑的模型如下:
1)执行的上下文由Context对象表示。 上下文在状态之间传递,并且由管理器用于流程决策。 上下文的API取决于您需要系统的通用性。
2)状态接口包含execute(Context)方法,其中特定逻辑发生。 它允许使用和更改上下文数据。
3)管理员配置了转换规则。 它能够确定要执行的下一个状态,给定上一个状态和上下文。 它从执行初始状态开始。 在每个状态S的执行后,它将上下文对象与与状态S关联的转换规则进行比较。 当它到达终端状态时,流程结束。
通过这种设计,状态实现不知道管理器的任何方式,也不涉及路由决策。

但是根据你的建议,状态模式不被使用,因为状态不能决定下一个状态。对吗? - Matroska
@Matroska:据我理解,状态设计模式的思想是存储对某个执行机制的引用,并将命令委托给它。当需要改变行为时,执行器可以随时替换。在我提出的设计中,我认为管理器使用了该模式,因为它存储了对当前状态的引用,并在每次转换后更改此引用。 - Eyal Schneider
@Matroska:我同意我的方法与维基百科的示例不同。但是,我认为这是一种更清晰的实现状态机的方式。各个状态之间不必相互了解。 - Eyal Schneider
我开始认为没有其他更干净的方式了。谢谢。 - Matroska

0

是的... 至少如果我正确理解了你的问题。 经理必须保留对当前状态的引用,因此当前状态必须能够“请求”经理移动到下一个当前状态。请参考维基百科示例


我可以要求经理将当前状态设置为下一个州,但如何激活下一个状态呢?在维基示例中并没有我的情况。如果我将stateContext.writeName(String name)放入其中一个状态的writeName方法中(在设置后),则情况将是相同的。 - Matroska
你不需要“激活”下一个状态。切换到下一个状态意味着告诉管理器(上下文)它的状态现在是NextState。当上下文需要执行某些操作时,它将其委托给其状态,并使用该方法的实现。 - Noich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接