软件设计重构秘笈8式-07组合替代继承

148 阅读1分钟

软件设计重构秘笈8式-07组合替代继承

概念

本文中的“使用组合代替继承”是指在根本没有父子关系的类中使用继承是不合理的,可以用组合的方式来代替。

意图

组合优于继承这个是设计模式中的一个原则 如下代码所示,Child 和Sanitation (公共设施)是没有逻辑上的父子关系,因为小孩不可能是一个公共设施吧!所以我们为了完成这个功能可以考虑使用组合的方式。

案例

public class Sanitation {

    public String washHands() {
        return "cleaned!";
    }

}

public class Child extends Sanitation {
}

重构

重构后的代码如下,把Sanitation组合到Child 类中,从而可以使用washHands这个方法, 这种方式我们经常会用到,其实IOC也使用到了这个原理,可以通过构造注入和方法注入等。

public class Sanitation {

    public String washHands() {
        return "cleaned!";
    }

}

public class Child  {

    private Sanitation sanitation;

    public Child() {
        sanitation = new Sanitation();
    }

    public String washHands() {
        return sanitation.washHands();
    }

}

总结

这个重构是一个很好的重构,在很大程度上解决了滥用继承的情况,很多设计模式也用到了这种思想(比如桥接模式、适配器模式、策略模式等)。