美文网首页设计模式
组合替代继承

组合替代继承

作者: cx7 | 来源:发表于2019-02-28 11:36 被阅读0次

HeadFirst设计模式第一章阐述的观点是多用组合,少用继承.
我的理解是适当使用继承的特性,不过度设计.

继承可能带来的负担

书上用到的例子
描述鸭子这个对象 假设鸭子都有飞行这个属性

public class Duck {
    public void fly() {
        System.out.println("鸭子的飞行属性");
    }
}

鸭子的实际对象野鸭会飞

public class YieldDuck extends Duck {
    public void fly() {
        System.out.println("野鸭会飞");
    }
}

鸭子的实际对象玩具鸭不会飞

public class MachineDuck extends Duck {
    public void fly() {
        System.out.println("玩具鸭不会飞");
    }
}

这样迭代下来会产生一个问题 需要关注的属性太多
每一个派生的鸭子 都需要重写fly方法来确定飞行这个属性
如果鸭子有飞行, 游泳,跑步...属性越多 继承的负担就越重

利用组合来避开可能的负担

把鸭子的飞行抽象成一种行为

public class Duck {

    protected DuckBehavior mBehavior;

    public interface DuckBehavior {
        void fly();
    }

    protected void fly() {
        mBehavior.fly();
    }

}

这样会不会飞可以分别描述
会飞的行为

public class DuckCanFlyBehavior implements Duck.DuckBehavior{

    @Override
    public void fly() {
        System.out.println("DuckCanFlyBehavior fly");
    }

}

不会飞的行为

public class DuckCantFlyBehavior implements Duck.DuckBehavior{

    @Override
    public void fly() {
        System.out.println("DuckCantFlyBehavior fly");
    }

}

再次描述鸭子的派生鸭子 都只需要动态指定鸭子的组成行为

public class GreenDuck extends Duck {

    public GreenDuck(DuckBehavior behavior)
    {
        mBehavior = behavior;
    }

}

组合替代继承之后,鸭子的逻辑更加清晰.
维护者只需要分别维护鸭子和鸭子行为的逻辑

组合和继承的选择

组合是has-a关系,继承是is-a关系
未完待续......

相关文章

  • 组合替代继承

    HeadFirst设计模式第一章阐述的观点是多用组合,少用继承.我的理解是适当使用继承的特性,不过度设计. 继承可...

  • 结构性模式(二):装饰器、外观模式

    1、装饰器模式(Decorator Pattern) 装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承...

  • 设计模式:组合、接口、委托替代继承

    针对“会飞”这样一个行为特性,我们可以定义一个 Flyable 接口,只让会飞的鸟去实现这个接口。对于会叫、会下蛋...

  • 设计模式之装饰器模式

    应用场景 装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。 装饰...

  • 结构型-Decorator

    装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该...

  • 继承

    原型继承 借用构造函数 组合继承 原型式继承 寄生式继承 寄生组合继承 优点: 因为组合继承最大的问题是无论什么...

  • 二、js继承的几种方式及优缺点

    1、继承:原型链、借用构造函数、组合继承、原型式继承、寄生式继承、寄生组合继承

  • 组合继承,寄生组合继承,class继承

    组合继承 说明:核心是在子类的构造函数中通过 Parent.call(this) 继承父类的属性,然后改变子类的原...

  • JS继承方式总结 (转)

    借用构造函数继承 原型链式继承(借用原型链实现继承) 组合式继承 组合式继承优化1 组合式继承优化2 ES6中继承...

  • js继承方式

    类式继承 构造函数继承 组合继承 类式继承 + 构造函数继承 原型式继承 寄生式继承 寄生组合式继承 寄生式继承 ...

网友评论

    本文标题:组合替代继承

    本文链接:https://www.haomeiwen.com/subject/cfhhuqtx.html