Java继承与组合

继承

继承有什么缺点:一句话:牵一发而动全身 

继承打破了封装的特性和提升了父类和子类的耦合度。

违背封装思想

在子类继承父类的时候必须要看父类的实现,如果重写了某个方法必须要看这个方法的调用点,否则会引起不可预知的错误。比如父类中调用了这个方法,而这个方法又被子类重写了,那么就会有问题。

举个例子:父类鸭子有两个方法,吃饭和吃饭之前。子类继承父类重写父类的吃饭之前方法,那么再次调用子类就会和预期不一样。

public class Duck {

    public void eat() {
        beforeEat();
        System.out.println("父类-吃饭");
    }

    public void beforeEat() {
        System.out.println("父类-吃饭前洗鸭爪");
    }

}
public class MallardDuck extends Duck {

    @Override
    public void beforeEat() {
        System.out.println("子类-吃饭前上厕所");
    }
}

所以导致如果想使用父类方法,必须要看父类实现!不能做到直接调用即可,这违背了封装的意义。

提升了父类和子类的耦合度

如果在代码维护阶段有需求要改下父类的实现,那么这就会有很大的风险,因为不知道哪个子类在使用父类的方法。或子类已经使用父类方法,改变会引起所有子类行为都发生改变。

如果想继承目标类,那么就继承了目标类的所有方法,包括一些自己不需要的方法。

举个例子:父类鸭子是会飞的,子类想继承父类,那么也继承了父类的飞行方法,那么如果子类的鸭子是不会飞的呢?比如子类是个橡皮鸭不具备飞行能力,如果也继承了父类就会有问题。

public class Duck {

    public void fly () {
        System.out.println("飞翔");
    }

}
public class RubberDuck extends Duck {

}
public class mian {

    public static void main(String[] args) {
        RubberDuck duck = new RubberDuck();
        duck.fly();
    }

}

继承确实有问题,可以使用接口实现啊。但是使用继承是因为继承有一个很大的好处就是能够代码的复用。而接口实现是没办法复用代码的,所以就提出了一个解决方式:组合模式。

组合模式

组合模式又叫策略模式,他封装了变化,将行为封装在类里面让子类既能够复用又不会造成继承带来的缺点。

举个例子:

将鸭子的飞行行为封装在 FlyBehavior 接口中

并将FlyBehavior接口作为Duck的属性,这样一来子类可以自己决定set什么内容

public class Duck {

    private FlyBehavior flyBehavior;

    public void setFlyBehavior (FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void fly () {
        flyBehavior.fly();
    }

}
public interface FlyBehavior {

    void fly();
}

public class FlyWithWings implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("飞行使用翅膀");
    }
}
public class mian {

    public static void main(String[] args) {
        Duck duck = new Duck();
        duck.setFlyBehavior(new FlyWithWings());
        duck.fly();
    }
}

可以看到组合模式区分了程序会变化和不会变化的点,并且可以动态操作程序的行为。

即有复用性又不会过度耦合。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值