Design patterns 状态模式长状态类名

Design patterns 状态模式长状态类名,design-patterns,state-pattern,Design Patterns,State Pattern,在我的应用程序中,我在28个状态上使用状态模式,这些状态用于有7个主要状态的会员卡,会员卡有4个布尔属性,它们实际上会影响其行为,所以我决定将它们嵌入状态,这就是它乘以28个状态的方式 现在的问题是状态类的命名,它越来越疯狂,我以这样命名的类状态结束 会员资格未创建打印链接高级冻结------我已将不同属性连字符以明确说明 州级名称可以这样吗?!对于最佳实践,我应该做些什么?也许你做得太过分了。我不认为你目前的方法是可维护的,这取决于这一切将如何发展,它可能导致不同状态的爆炸 关于你如何解决这个

在我的应用程序中,我在28个状态上使用状态模式,这些状态用于有7个主要状态的会员卡,会员卡有4个布尔属性,它们实际上会影响其行为,所以我决定将它们嵌入状态,这就是它乘以28个状态的方式

现在的问题是状态类的命名,它越来越疯狂,我以这样命名的类状态结束 会员资格未创建打印链接高级冻结------我已将不同属性连字符以明确说明


州级名称可以这样吗?!对于最佳实践,我应该做些什么?

也许你做得太过分了。我不认为你目前的方法是可维护的,这取决于这一切将如何发展,它可能导致不同状态的爆炸

关于你如何解决这个问题,我有一些想法。您可以使用状态模式实现7个主要状态,并使用标志跟踪其他条件,因此可以在每个状态中基于这些条件编写条件语句。函数中的代码将变得更加复杂,但我相信它仍然更易于维护

我没有太多关于状态转换和所有内容的信息,但另一个想法是创建一个状态类,通过传入激活状态所需满足的条件集合,可以从中创建

然后,您不必命名任何状态,只需将它们保存在一个集合中,当主对象的任何属性更改可能导致状态更改时,您可以循环状态集合,然后通过将对象属性与状态条件进行比较来找到新状态


注意,您还可以使用HashMap来存储状态,并根据所有条件创建一个hash,以获得唯一的密钥。这将使状态查找比在所有状态上循环查找下一个状态更快。

正如plalx评论的那样,目前的设计不容易维护。正如plalx所建议的,您应该只有7个主要状态


对于其他4个属性,一个选项是使用decorator设计模式。这4个属性中的每一个都可以设计为4个装饰类。根据设置的属性,相应的装饰器对象将包装原始对象。然后,装饰器可以拦截来自客户端的调用,并根据该装饰器的属性修改行为。

我想到了第一个解决方案,但不想破坏模式,这就是为什么我要努力使其完全正确:(好吧,有时候它就是不合适。你想要实现它的方式就是不可维护的。你有没有想过我的第二个解决方案(使用匿名类)?这肯定比为每个排列创建一个具体的类要好。我不确定我是否得到了你的第二个解决方案,可能是因为我不太了解匿名类,我使用的是c#顺便说一句,它支持匿名类吗?@user2080257,嗯,我查过了,c#中没有类似匿名类的东西,不过你可以看看如果您有4个布尔属性,那么它是否应该单独转换为16个状态?可能您的意思是一次只能设置其中一个属性,如果是这样的话,那么这些属性就不是独立的。我已经检查了decorator模式,但它看起来是可用的,扩展类中的方法必须包含作为它的一部分,它的基本方法在具体类中的完整行为,这里不是这样,我大部分时间都在谈论每个方法的完全不同的行为。我说得对吗?我认为装饰器模式在这里不会很好地工作,因为它是定义行为的多个状态的组合,这是这意味着装饰者需要知道其他人的行为来定义自己的行为。@user2080257你是对的。如果每个方法都不同,那么装饰者模式就不适合了。如果23个州中的每个州的大多数方法都不同,那么你在改进当前的设计方面就无能为力了。