状态模式中的最大状态数

Posted

技术标签:

【中文标题】状态模式中的最大状态数【英文标题】:Maximum number of states in State Pattern 【发布时间】:2013-02-01 22:37:54 【问题描述】:

我正在尝试使用状态模式,但我有一个问题。状态模式是否仅适用于状态数量有限的情况,如下所示:

TCP 状态: 1- TCP已建立 2- TCP监听 3- TCP关闭 等等

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

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

非常感谢。

【问题讨论】:

一般来说,如果您可以使用您提到的变量定义有限数量的状态,我认为您可以使用状态模式,例如“工资在 1/2/3 范围内”、“多于或少于 8 小时来补偿”等。但最好先解释一下您要构建什么软件,以及为什么考虑使用 State 模式首先。 该系统是一个许可管理系统,用于授予用户访问某些位置的访问卡。许可证将具有几个属性,当它们组合在一起时将形成一个强制某些行为的状态,这就是我选择状态模式的原因。许可证将具有 State 属性(由 6 个变体组成)和 StoppedState 属性(由 3 个变体组成)以及指示是否打印许可证的 IsPrinted 属性。谢谢 [别在意我之前的评论;删除它] 从您上面写的内容看来,不同状态的数量已经有限(6 加 3)。当前活动状态是根据参数选择的,这些参数本身具有无限(或非常大)数量的可能值,但这并不意味着您的状态数量不受限制。 不幸的是,情况比上面解释的 6 x 3 x 2 可能状态要复杂一些,添加所有属性可以将状态可能性提高到 150+ 状态,我只是想让事情变得简单在不深入了解业务逻辑的情况下交付想法。 【参考方案1】:

没有定义“状态”类的最大数量,但如果您为每个“状态”实现一个“状态”类,您最终可能会出现大量代码重复,这本身就是一个问题。

请注意,赋值组合中的“状态”与状态模式中的“状态”类不同,状态模式是一组抽象方法。如果你问我用词不当,“状态”最好在模式中称为“行为”。

如果您可以在一组有限的“状态”类中捕获行为(即,如果它可以用有限数量的代码行构建,那么可能是的),那么您可以应用状态模式。正如您已经提到的,您可以通过维护多个活动状态来多次应用状态模式。

【讨论】:

以上是关于状态模式中的最大状态数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript设计模式中的状态模式

状态模式和策略模式区别

设计模式之状态模式与备忘录模式详解和应用

JavaScript中的设计模式:状态模式

idea在debug模式启动非常慢,日志正常debug模式一直在启动中状态

设计模式--状态模式