将类型代码替换为状态/策略
什么是类型代码?当您拥有一组数字或字符串,而不是单独的数据类型时,类型代码就会出现,这些数字或字符串构成了某些实体的允许值列表。通常这些特定的数字和字符串通过常量被赋予可理解的名称,这就是为什么这种类型代码会遇到这么多的原因。
问题
你有一个影响行为的编码类型,但你不能使用子类来摆脱它。
解决方案
用状态对象替换类型代码。如果需要用类型代码替换字段值,则“插入”另一个状态对象。


为什么重构
你有类型代码,它影响类的行为,因此我们不能使用用类替换类型代码.
类型代码影响类的行为,但由于现有的类层次结构或其他原因,我们不能为编码的类型创建子类。这意味着我们不能申请用子类替换类型代码.
好处
这种重构技术可以避免具有编码类型的字段在对象的生命周期内更改其值的情况。在这种情况下,值的替换是通过替换原始类引用的状态对象来实现的。
如果您需要添加一个编码类型的新值,您所需要做的就是添加一个新的状态子类,而不需要更改现有的代码(参见打开/关闭原则).
缺点
- 如果您有一个简单的类型代码案例,但您仍然使用这种重构技术,那么您将有许多额外的(并且不需要的)类。
知道就好
这种重构技术的实现可以使用以下两种设计模式之一:188bet平台电子游戏状态或策略.无论您选择哪种模式,实现都是相同的。那么在特定情况下你应该选择哪种模式呢?
如果您试图拆分控制算法选择的条件,请使用Strategy。
但是,如果编码类型的每个值不仅负责选择算法,而且负责类的整个条件、类状态、字段值和许多其他操作,那么state更适合这项工作。
如何重构
使用自封装字段为包含类型代码的字段创建getter。
创建一个新类,并给它一个适合类型代码目的的易于理解的名称。这门课将扮演状态(或策略).在其中,创建一个抽象编码的字段getter。
为编码类型的每个值创建状态类的子类。在每个子类中,重新定义编码字段的getter,以便它返回编码类型的相应值。
在抽象状态类中,创建一个静态工厂方法,该方法接受编码类型的值作为参数。根据这个参数,factory方法将创建各种状态的对象。为此,在其代码中创建一个大条件;当重构完成时,它将是唯一的一个。
在原始类中,将编码字段的类型更改为状态类。在字段的setter中,调用工厂状态方法以获取新的状态对象。
当所有可移动的东西都被移动了,使用用多态性替换条件型为了一劳永逸地摆脱使用类型代码的条件。