状态模式中状态的最大数量

3

我正在尝试使用状态模式并且有一个问题。状态模式只设计用于像这样仅有少量状态的情况吗:

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

还是它可以用于具有数百个状态的情况,例如员工考勤系统中的员工,其中员工将具有多个组件的组合状态,例如他在余额中拥有的年假数,他应该弥补本月的工作时间,表示他的小时薪酬率的状态,具体取决于本月的工作负载等。每个员工都可以具有多个属性的组合,最终被认为是具有某些特定行为的状态。

在这种情况下,将会有数百个状态对象,这样做是否正确?您将如何管理状态对象的命名?如果例如三分之一的状态共享某些方法的某种行为,而另外四分之一则共享某个方法的另一种行为等等,您将怎么做。即,并不是所有状态必须在所有方法中具有唯一的行为。我认为将实现复制并粘贴到所有具有此常见方法相同行为的状态中不明智!

非常感谢。


1
一般来说,如果您可以使用您提到的变量定义有限数量的状态,例如“工资在1/2/3范围内”,“补偿时间多于或少于8小时”等,则可以使用状态模式。但最好首先解释一下您想要构建的软件以及为什么首先考虑使用状态模式。 - The Nail
该系统是一个许可证管理系统,用于向用户授予访问特定位置的访问卡。该许可证将具有几个属性,当这些属性组合在一起时,将形成一个状态,强制执行某些行为,因此我选择了状态模式。该许可证将具有一个State属性(由6个变体组成)和一个StoppedState属性(由3个变体组成),以及一个IsPrinted属性,指示许可证是否已打印。谢谢 - Sisyphus
从您上面的写法来看,不同状态的数量已经有限(6加3)。当前活动状态是基于参数选择的,这些参数本身具有无限(或非常大)的可能值,并不意味着您的状态数量不受限制。 - The Nail
不幸的是,情况比上面解释的6 x 3 x 2种可能状态更加复杂,添加所有属性可能会增加状态可能性到150+种状态,我只是试图保持简单,传达思想而不深入业务逻辑。 - Sisyphus
1个回答

1

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

请注意,“state”指的是分配值的组合,与状态模式中的'State' class不同,后者是一组抽象方法的实现。如果你问我,这是一个错误的名称,应该用“Behaviour”来代替“State”。

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


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