问题标签 [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.
java - Implementing State Pattern
I am implementing a state pattern in Java for my application and need few clarifications.
The state machine has 5 states State 1 to State 5. The are a total of 5 events(Event1 to Event5) which causes the state transition. Not all events are applicable in all the states. If the event is not applicable in that particular state the application will throw exception.
When the state machine gets initialized it starts with state1.
Following is the interface and the context class.
To make it simple, I have provided implementation for only one state.
I want to release the lock only after entering state. Also I don't want to hold the lock till enter() finishes. If I hold the lock till enter finishes I cannot handle other events and it may get timed-out.For some events (which don't really change the state) we need to read the state and based on the state we can process them or ignore them. If I don't release lock they cannot be processed.Also in some other cases if an event comes to shutdown(this event changes the state) the state machine while enter() is in progress I cannot handle it. I have to shutdown the state machine immediately since it is not appropriate in continuing the enter() after shutdown event has come.
My Question: Is it good java programming practice to expose the accquireLock and releaseLock as an API in Context class and use them in each state class.
Thanks, Arun
oop - 状态模式和策略模式的区别
查看 GoF 模式,我发现 State 和 Stategy 模式之间的相似之处相当惊人。两者都交换了多态类来修改行为。其他人发现了相同的吗?
确切的区别是什么?
oop - 备忘录设计模式和状态设计模式
Memento 设计模式用于将对象恢复到以前的状态,例如撤消。但是我们可以多次撤消和重做。我已经多次阅读文章,但我仍然不清楚它们是否相似或相互补充并且可以一起使用。
状态模式可以和备忘录设计模式相关还是一起使用?
design-patterns - 状态模式状态中的常见行为
您有一台具有 3 种状态和 2 种方法的 ATM 机。如果这是模式的伪实现。
如果Operation1
3 种状态具有相同的行为,您只需将实现放在Operation1
第 02 行,但是如果Operation1
只有 2 种状态具有相同的实现而第 3 种状态具有不同的实现呢?你将如何在不重复代码的情况下解决这个问题?
PS这当然是一个非常简化的例子,但是同样的概念将继续说40个状态和7个操作要实现。
design-patterns - 状态模式长状态类名
我在我的应用程序中使用了 28 个州的状态模式,这些州适用于有 7 个主要州的会员卡,会员卡有 4 个布尔属性实际上会影响其行为,所以我决定将它们嵌入到状态中,那就是它是如何增加到 28 个州的。
现在的问题是状态类命名,它变得越来越疯狂,我最终得到了这样的类状态 Membership-UnderCreation-Printed-Linked-Premium-Frozen -----我用连字符连接了不同的属性以使其清楚。
状态类名可以这样吗?!我应该怎么做才能获得最佳实践?
java - 我可以用状态设计模式解决这个纸牌游戏应用程序吗?
我已经做了很长一段时间了,我似乎无法解决游戏的动态问题。
所以,基本上,这款游戏是我的国家非常流行的纸牌游戏,名为 Truco。我将尝试用以下要点来解释它,但无论如何,我解释后的粗体段落对于游戏的结构来说非常简单明了,所以,请随意跳过。
- 每个玩家轮流轮流,例如在每个回合中,玩家 1 可以打出一张牌并执行一个动作。
- 动作 A 有点像扑克出价,它提高了获胜者通过赢得比赛获得的积分数量,玩家 2 必须决定他们是否弃牌/输掉游戏,接受挑战还是反击,并提高赌注。
- 还有另一种类型的动作,我们称之为动作 B,如果玩家 1 调用它而玩家 2 拒绝接受它,与动作 A 不同,游戏还没有结束,玩家 2 只是在游戏结束时失去一些分数。也可以反驳这一点。
- 在一个回合中,玩家最多可以调用两个动作,但他永远不能调用已经在游戏中调用过的动作。
- 每回合结束时玩家打出一张牌。
对于不了解游戏的人来说,所有这些信息一定是非常令人困惑的信息。因此,总而言之,总共有 6 个回合,每个回合由玩家打出他的牌结束,并且在每个回合本身中,两个玩家之间都会交换一些信息,其中包括轮到的玩家可以挑战的挑战打电话,对方必须接受或拒绝。除此之外,当比赛结束时,比赛本身并没有结束,比赛一直进行到两人中的一个达到 30 分,通过赢得比赛和挑战。
我开始尝试使用 while 循环来设置它,但由于循环从不暂停并等待 onClickListeners,因此很容易失败。然后,我发布了这个问题:如何在 Android 中处理玩家回合?
我开始对状态设计模式进行一些研究,并且在过去的几天里一直在研究它。我有一个游戏本身的课程:GameTruco。一个TrucoState类和该 TrucoState 的 10 种不同实现. 在 GameTruco 中,我有所有这些不同状态的实例以及我需要跟踪的所有不同变量,对于玩家可以执行的两个动作,轮到谁,轮到哪轮。所以,我的 GameTruco 中的所有选项(无论是不同的状态和调用这些状态的不同方法)都只考虑在可以调用的不同挑战之后的游戏状态,但不要考虑打牌本身......我不知道如何处理这个。而且,当我完成设计时,我不太明白如何将它与我的 Button 的 onClickListeners 混合。
如果有人能建议我如何解决这个问题,我将不胜感激,无论是通过建议改变我的状态模式还是解决纸牌游戏动态的其他方式。
android - Android - 有没有办法从布局中清除所有按钮并根据状态类重新插入它们?(状态设计模式)
问候 Stackoverflowians
我正在开发一个 Android 纸牌游戏应用程序。我已经将整个游戏的动态放入我使用状态设计模式(状态机)实现的 GameClass 中,考虑到处于游戏特定状态的两个玩家中的任何一个都将有不同的可用动作。
例如,当游戏开始时,玩家 A 只能执行 GameClass 共有的 21 个方法中的 5 个。根据打出的动作和卡牌,方法会转换不同的状态,并且在每个不同的状态下,都会有不同的方法可用。
因此,我通过一个名为 CurrentActions 的类解决了不同方法的可用性问题,该类为每个方法设置和获取布尔值。所以,如果我想向玩家展示他在游戏开始时可以选择的动作,我有一系列的 IF(大约 21...)检查是否有任何 Getter 设置为 true,如果它们是我将按钮添加到布局中,一切都像魅力一样。
现在,我最大的问题是我不知道如何显示第一个状态的按钮,然后一旦玩家 A 点击其中一个按钮(方法),清除之前状态中可用的所有按钮,现在显示游戏所处的新状态的新按钮。
有没有办法做到这一点?我已经使用 Layout.removeAllViews() 方法清除所有按钮,但是根据以下状态重新设置所有按钮是我最大的问题。我真的很感激关于这个问题的任何指导。
为了响应您查看一些代码的请求,我在我的 Activity 中添加了处理游戏、布局、按钮和可能操作的代码:
对于游戏中存在的每一个动作,我都会使用其中一个 IF。所以....在我单击一个可用按钮(根据游戏状态)后,有没有办法清除 actionsLayout 并执行一组新的按钮并在每次按下按钮后连续执行此操作(即:状态的每一次变化)?
design-patterns - 使用状态模式时,耗时的转换真的只是状态吗?
我正在使用状态模式来设计一个服务来控制物理机。机器具有打开和关闭状态(以及一些其他有用的状态)。此外,它还有像 Open ==> Close 这样的转换。
这些转变开始了需要时间的物理过程,我想知道我是否真的应该将它们建模为状态。
一方面,这些不是我期望机器处于的稳定状态。它们没有多种行为,也不接受命令。开放,只做一件事 - 它过渡到开放。
另一方面,我希望人们能够查询服务并获得有关其状态的真实答案。如果一个进程请求我的状态并且我已经向机器发送了打开命令,但它还没有完成打开,那么我应该返回什么状态?打开听起来不错。
建议?智慧?两种方法之间是否存在权衡?
java - 状态模式和封装
我最近一直在开发 Java 应用程序,并且一直在尝试遵循 GoF 的状态模式来尝试整理代码。
该程序使用多代理系统的代理来代表“超级代理”评估指令(示例如下)。
超级代理可以以两种状态存在,并且到处都有 if 语句检查状态然后执行特定于状态的行为会变得很混乱。
这是该程序的(非常)简化版本。实际实现具有更多特定于状态的行为。
状态模式非常适合根据 GoF 模式将特定状态的行为封装到不同的类中(superAgent 类将是上下文)。但是有两个问题,这两个问题(IMO)都破坏了封装:
大多数特定于状态的行为都需要对超级代理的私有成员(在上面的示例中为指令数据)进行更改。成员包含的数据可能不应该被访问,并且绝对不应该对包装类是可变的。
特定于状态的行为需要与非特定于状态的行为同步。如果不通过公开或使用 getter 来公开锁对象(在上面的示例指令锁中),则状态和上下文无法共享锁。公开锁违反了 OOP,因为它可能被包装/扩展类使用。
考虑到示例和上述两点,是否有人对我如何封装这种特定于状态的行为有任何建议?
php - 重构嵌套的 if 语句
这是我拥有的一种方法的简化版本。
看起来仍然很复杂
如何重构这种疯狂?
我尝试使用状态模式对其进行重构,但由于我不太熟悉该模式,因此无济于事。
这就是我所做的,但很快就放弃了。
显然这只是测试第一个if
分支,我怎样才能自动检查其他分支呢?
我很确定我的方法有问题。
有没有办法修复这种状态模式来测试所有if
分支?
已编辑
此方法的作用是,它$this->value
根据存储在中的配置属性检查是否包含预期值$this->data
例子$this->data = array('allow_num'=>true)
,如果$this->value='a1'
它被认为是有效的例子$this->data = array('allow_num'=>false)
,如果$this->value='a1'
它被认为是无效的
有没有办法简化这种方法?