问题标签 [state-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
134136 浏览

java - 如何在 Java 中实现 FSM - 有限状态机

我有工作要做,我需要你的帮助。我们要实现 a FSM - Finite State Machine,来识别字符序列(例如:A、B、C、A、C),并判断它是否被接受。

我们认为要实现三个类StateEventMachine。该类state在 中表示一个节点FSM,我们认为用 来实现它State design pattern,每个节点都将从抽象类状态扩展,每个类将处理不同类型的事件并指示到新状态的转换。你认为这是个好主意吗?

第二件事,我们不知道如何保存所有的转换。我们再次考虑用某种 来实现它map,它保持起点并获得某种带有下一个状态的向量,但我不确定这是一个好主意。

我很乐意得到一些关于如何实现它的想法,或者你可以给我一些起点。

我应该如何保存 FSM,这意味着我应该如何在程序开始时构建树?我用谷歌搜索并找到了很多例子,但没有什么对我有帮助。

非常感谢。

0 投票
2 回答
1390 浏览

java - Java 状态设计模式/“子状态”

我正在用 Java 编写代码,我使用像这个例子这样的状态设计模式:http: //onjavahell.blogspot.fr/2009/05/simple-example-of-state-design-pattern.html

但是我得到的 UML 是这样的:

我有“子状态”。怎么能打码?我应该制作抽象类State 1还是有其他方法?搜索我没有找到任何这样的例子。

0 投票
1 回答
261 浏览

design-patterns - 状态模式滥用

我正在尝试创建一个从状态到状态的简单流程(总共 6 个或 7 个),我决定实现一个状态模式。当真正应该有一个主要流程时,让每个状态转换到每个状态感觉好像有太多的开销。所以基本上每个状态只会真正转换到下一个状态。这不是状态模式的用途,对吗?我将其理解为一种能够从几乎每个状态过渡到每个其他状态的模式(可能有一些例外)。我应该为我的场景使用什么模式?

在此先感谢您的帮助。

0 投票
1 回答
437 浏览

c# - 状态模式 - 在每次转换之前执行操作

我已经实现了一个简单的状态模式,它应该在我的模型类之上运行。我的应用程序是用 C# WPF 编写的。

首先,我不太确定需要将状态模式逻辑放在哪里。我应该把它放到我的控制器或服务类中吗?

假设您想在进行实际转换之前验证一些事情。目前我已经创建了一个可以直接从状态模式类调用的规范。

但这是正确的方法吗?

这是用于状态模式内的验证/检查点。但是在进行转换之前应该在状态模式内执行的操作呢?

我将在某种服务类中实现这些操作,并直接从我的状态模式中调用这些服务类。

这又是正确的方法吗?

0 投票
2 回答
3094 浏览

java - 谁在状态模式中定义状态转换?

我知道State patterncan 可用于对根据状态改变行为的对象进行建模,并且Contextcan 具有的各种状态封装在表示Stateinterface 的具体类中。我不清楚的是在这种模式下状态转换是如何发生的。个人是否states知道并决定跟随他们的人,还是Context决定下一个状态的人?

0 投票
1 回答
298 浏览

java - 什么是 Core Java/JSF/Servlets 中的状态模式示例?

我刚刚了解了状态模式。我想知道在核心 Java/JSF/Servlets 代码中哪里可以看到这种模式正在实现?我想看看状态转换是如何实现的,谁在其中扮演角色,states谁在其中扮演角色context

0 投票
2 回答
793 浏览

java - 在状态模式中实现继承层次结构

我有一个与此非常相似的设计:

在此处输入图像描述

这里NewOrderRegisteredGranted都具有通用方法AddOrderline()and Cancel(),因此将这两种方法重构为父类很容易。

当我想要Cancel一条Shipped线时出现问题(目前图中未显示)。

由于Shipped行不支持AddOrderline(),因此我需要将NewOrderRegistered & Granted的父类分为 2 个类,一个用于 the Cancel(),另一个用于AddOrderline().

现在NewOrder必须扩展 2 个父类才能获得 2 个函数。

笔记

  1. 这个例子非常简化。我的真实应用程序有大约 12 个状态。
  2. 代码是用 PHP 编写的,但欢迎使用 C# 或 Java 的解决方案,因为我认为解决方案将是相似的,因为它们都不支持多重继承。
0 投票
1 回答
232 浏览

design-patterns - 状态模式中的最大状态数

我正在尝试使用状态模式,但我有一个问题。状态模式是否仅针对具有以下状态数量的情况而设计:

TCPState:1- TCPEstablished 2- TCPLisenting 3- TCPClosed 等。

或者它可以用于具有数百个状态的情况,例如员工考勤系统中的员工,其中员工将具有多个组件的复合状态,例如他的余额中的年假数,他应该补偿的小时数月,一个状态来表示他的小时工资率取决于本月的工作量等。每个员工可以具有多个属性的组合,最终被认为是具有某种行为的状态。

在这种情况下会有数百个状态对象,这样做正确吗?您将如何管理状态对象命名?以及如果例如三分之一的州对某种方法共享某种行为,而另一季度对某种方法共享另一种行为等,您会怎么做。即并非所有州在所有方法中都具有独特的行为。我不认为复制实现并将其粘贴到对这种通用方法具有相同行为的所有状态中是明智的!

非常感谢。

0 投票
1 回答
220 浏览

c++ - 使用引用实现状态模式

我正在尝试重构我的代码,其中包括应用状态模式。我更像是一名 Java 程序员,所以请保持友善 ;) 所以,这里我有我的基本状态类,没什么特别的:

和其中一个孩子状态:

然后是 Context 类,它保存当前状态并在其 fromImage 方法/函数内部调用 processImage:

问题是,当我尝试编译此代码时,我在第 10 行收到以下错误

我做错什么了?我尝试在 CONTEXT 类头文件中添加不完整的 AlghoritmState 类声明,但它只会引发另一个错误:

任何提示表示赞赏。

0 投票
2 回答
341 浏览

oop - 设置器和状态模式中的逻辑

让我们定义一个简单的状态机:

和一个简单的状态对象

正如我们在 setter 中看到的,我们检查状态更改是否有效。我的问题:

  1. 向 setter 方法添加一些逻辑是否是一个好的解决方案(我们不感兴趣它是如何工作的,只关心 setter 中的事实逻辑)?
  2. 我们什么时候应该添加逻辑,什么时候不应该?
  3. 如果不是为什么?