Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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_Design Patterns_State Pattern - Fatal编程技术网

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

Java 状态设计模式中的转换方法,java,design-patterns,state-pattern,Java,Design Patterns,State Pattern,我有一个具有许多状态的状态机a--B--C--D--E。我有许多从C到A的转换,例如,如果某个条件得到验证。对于每个状态,我都有一个扩展抽象类的类state,我还有一个管理器,负责将每个转换方法委托给状态方法。问题是“各州能否直接调用管理器转换方法?”。我在互联网上只看到过一些例子,其中有一个主类确切地知道转换发生了多少次(即insertQuarter(),ejectQuarter(),turncank(),dispense())。 我发现实现这一点的唯一方法是在状态中调用管理器转换方法。这是错

我有一个具有许多状态的状态机
a--B--C--D--E
。我有许多从
C
A
的转换,例如,如果某个条件得到验证。对于每个状态,我都有一个扩展抽象类的类
state
,我还有一个管理器,负责将每个转换方法委托给状态方法。问题是“各州能否直接调用管理器转换方法?”。我在互联网上只看到过一些例子,其中有一个主类确切地知道转换发生了多少次(即
insertQuarter()
ejectQuarter()
turncank()
dispense()
)。 我发现实现这一点的唯一方法是在状态中调用管理器转换方法。这是错误的做法还是不好的做法

提前谢谢
Tobia

如果您需要一个简单的同步状态机,其中在任何给定的时间点最多执行一次,那么我想到的模型如下:

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

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

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


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

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

但是根据您的建议,不使用状态模式,因为状态不决定下一个状态。对吗?@Matroska:据我所知,状态设计模式的思想是存储对某个执行机制的引用,并将命令委托给它。当需要改变行为时,可以随时更换执行器。在我提出的设计中,我认为管理者使用了该模式,因为它存储了对当前状态的引用,并在每次转换后更改该引用。@Matroska:我同意我的方法与Wikiperia的示例不同。然而,我认为这是实现状态机的一种更干净的方法。各州之间不必互相了解。我开始认为没有其他更干净的方法了。ThanksI可以要求经理移动到另一个状态,将当前状态设置为下一个状态……但是如何激活下一个状态呢?在wiki示例中,没有我的情况。如果我将stateContext.writeName(字符串名称)放入其中一个状态的writeName方法(设置后)中,则不会“激活”下一个状态。切换到它意味着告诉管理器(上下文)它的状态现在是NextState。当上下文需要执行某些操作时,它会将其委托给方法实现的状态。