以State/Strategy取代类型码(Replace Type Code with State/Strategy)
你有一个类型码,它会影响到类的行为,但是你无法通过继承手法消除它;以状态对象取代类型码
一、动机
本项重构与Replace Type Code with Subclass很相似,但如果“类型码的值在对象生命期中发生变化”或“其他原因使得宿主类不能被继承”,你可以使用本重构,本重构使用State模式或者Strategy模式
二、做法
1、使用Self Encapsulate Field将类型码自我封装起来
2、新建一个类,根据类型码的用途为它命名。这就是一个状态对象
3、为这个新类添加子类,每个子类对应一种类型码
4、在超类中建立一个抽象的查询函数,用以返回类型码。每个子类中覆盖该函数,返回确切的类型码
5、编译
6、在源类中建立一个字段,用以保存新建的状态对象
7、调整源类中负责查询类型码的函数,将查询动作转发给状态对象
8、调整源类中为类型码设值的函数,将一个恰当的状态对象子类赋值给“保存状态对象”的那个字段