一.适用环境
某个子类(subclass)只使用父类(superclass)接口中的一部分,或者根本不需要继承而来的数据.
二.解决方案
在subclass中新建一个值域用以保存superclass,调整subclass,令它改而委托superclass,然后去掉两者之间的继承关系 .(Refactoring)
三.动机
在有些时候使用继承来获取数据并不是最好的选择,继承带来的是强耦合,同时子类或许根本用不上继承而来的所有数据.
这时你就应该重构你的设计,怎么去掉这种强耦合关系?怎么让父类的数据资源不至于浪费?
四.范例
假如我们有如下代码:


public class Empolyee //雇员类(父类)
{
// 很多数据
public void Compute()
{
//


}
// 其他一些方法
}
public class Manager:Empolyee //经理(子类)
{
}
这里假如说我们Manager类只需要父类的Compute()方法, 如果采用上面这种继承关系来实现,就会导致资源的浪费,因为Manager类其实只到了父类的一小部分数据而已,我们根本不必让子类去拥有父类的所有数据.
同时,从OO的观点来看,继承意味着强耦合,而OO的设计原则的思想就是要把这种强耦合关系转化为松耦合.
那么,怎么实现呢? 对象引用,就把这种类的继承关系转化为类的组合,这体现出另一个OO设计原则:优先使用对象组合,而非继承.
所以,我们把代码重构如下:


public class Empolyee
{
// 很多子类根本用不到的数据
public void Compute()
{
//


}
}
public class Manager
{
Empolyee e=new Empolyee (); //使用对象组合,而非继承
public void Compute()
{
e.Compute(); //委托给父类的Compute()方法
}
}
这样一来,就消除了我们上面说到的两个问题:强耦合和资源浪费
五.作法
1.在subclass中新建一个值域,使其引用superclass的一个实体.
2.修改subclass里的函数,让他们不在使用superclass,转而使用上面那个受托值域.
3.去除两个classes之间的继承关系.
4.针对客户端使用的每一个superclass函数,为它添加一个简单的请托函数.