处理继承关系
主要是函数和字段在继承体系中的上下调整
1.函数上移(Pull Up Method)
- 避免重复代码
- 如果某个函数在各个子类中的函数体都相同,则函数上移适合此场景
- 如果两个函数工作流程大体相似,但是先细节略有差异,则考虑使用模板方法构造出相同的函数,再提升他们
2.字段上移(Pull up Field)
- 各子类拥有重复的属性,,或者函数对他们的使用方式都非常相似,则提升至超类去
3.构造函数本体上移(Pull Up Constructor Body)
- 子类中存在公共代码,而且操作的是同一个字段,则可以考虑将构造函数和此字段同时上移
4.函数下移(Push Down Method)
- 如果超类中某个函数只与一个或少数几个子类有关,那么最好将其挪走,放在真正关心它的子类中去
5.字段下移(Push Down Field)
- 如果一个字段只被一个子类或一小部分子类用到,则将其搬移到需要该字段的子类中去
6.以子类取代类型码(Replace Type Code with Subclass)
- 表现相似但有不同的东西
- 大多数时候,有类型码来区分就足够了。但是,我们可以引用子类,用继承的方式实现,让子类本身只执行自己的逻辑,这也是多态的一个应用,也就不需要每个方法都先去判断一下类型码
- 只需要在获取子类对象时,适用类型码进行区分,构造出一个工厂函数来,把选择器逻辑放在工厂方法中
7.移除子类(Remove Subclass)
- 随着软件的演化,子类所支持的变化可能被搬移到别处,甚至完全去除,这时子类就失去了价值
- 移除子类,将其替换成超类的一个字段
8.提炼超类(Extract Superclass)
- 如果两个类在做相似的事,可以利用基本的继承机制把他们相似指出提炼到超类,可以使用字段上移搬移数据,函数上移搬移行为
- 首选方案,即便错了,还有“以委托取代超类”这瓶后悔药
9.折叠继承体系(Collapse Hierarchy)
- 随着继承体系的演化,一个类和其超类已经没太大差别时,不值得在作为独立的类存在,合并。
10. 以委托取代子类(Replace Subclass with Delegate)*
- 改善继承的短板,不能以多种分类方式区分子类
- 继承给类之间引入了非常紧密的关系,在超类上做修改,都有可能破坏子类
- 委托关系更加清晰,耦合更少
- 原则:对象组合由于类继承
- 当使用继承出现问题时,就可以使用委托了
-
和策略模式类似,加了一个叫做委托类的中间层,在子类的构造方法中初始化此委托类
-
将行为从子类中搬移到委托类中,就可以修改工厂函数,令其返回超类实例,删除子类
-
取代继承体系,去除整个继承体系
- 找个简单的子类先为它建立一个委托类
11.以委托取代超类
- 委托:就是创建一个中间层委托类,然后在源类的构造函数中将对应的委托类创建
- 源类中也有一个字段来表示委托类
- 如果子类与超类之间耦合过强,超类的变化很容易破坏子类的功能,则可以使用“以委托取代超类”
- 委托手法本质就是将被委托的类作为一个委托组件放在源类中