处理泛化关系
Pull Up Field(字段上移)
problem:两个类有相同的字段
solution:从子类中删除该字段并将其移动到超类
重构原因?
子类分别增长和开发,导致出现相同(或几乎相同)的字段和方法
Pull Up Method(方法上移)
problem:子类具有执行类似工作的方法
solution:使方法相同,然后将它们移动到相关的超类
重构原因?
子类彼此独立地增长和发展,导致相同(或几乎相同)的字段和方法。
Pull Up Constructor Body(构造函数本地上移)
problem:所有子类具有的构造函数代码大部分相同。
solution:创建一个超类构造函数,并将子类中相同的代码移动到它。在子类构造函数中调用超类构造函数
1 | class Manager extends Employee { |
重构原因?
子类构造器会隐式调用父类的默认构造,如果父类没有默认构造器,需要显示调用。
因此我们可以把子类中共有的初始化代码移到父类构造器中。
Push Down Method(方法下移)
problem:在父类中实现的方法只被一个(或少数几个)子类使用
solution:将这些方法移到子类中。
重构原因?
当初父类设计的通用方法实际上只被一个(少数几个)子类所使用
Push Down Field(字段下移)
problem:在父类中的字段只被一个(或少数几个)子类使用
solution:将这些字段移到子类中。
重构原因?
当初父类设计的通用字段实际上只被一个(少数几个)子类所使用
上面的一些重构手法让人感觉有些冲突,实际上何时采用何种手法,并没有明确的界限去规定,根据自己的感觉去判断通用性。
下面这些方法感觉彼此冲突,界限不明确,实用性暂时不高,暂时不分析,这里仅仅提供定义。
Extract Subclass
Problem: 一个类的特性仅仅在某些条件下被使用
Solution: 将这些特性移到子类中
Extract Superclass
Problem: 两个类有基本相同的字段和函数
Solution: 创建一个父类,把相同的字段和函数移进去
Extract Interface
Problem: 多个客户端使用类接口的相同部分。另一种情况:两个类中的部分接口是相同的
Solution: 将此相同部分移动到其自己的接口
Collapse Hierarchy
Problem: 有一个类层次结构,其子类实际上与其超类相同
Solution: 合并子类和超类
Form Template method
Problem:子类实现的算法包含相同顺序的类似步骤
Solution:将算法结构和相同的步骤移动到超类,并在子类中保留不同步骤的实现
Replace Inheritance with Delegation
Problem: 有一个仅使用其超类的一部分方法的子类(或者它不可能继承超类数据)
Solution: 创建一个字段并在其中放置一个超类对象,将方法委托给超类对象,并取消继承
Replace Delegation with Inheritance
Problem:一个类包含许多简单的方法,这些方法委托给另一个类的所有方法
Solution:使该类成为委托继承者,这使得委托方法变得不必要