组合 和 继承

    *来自java编程思想中文版,第四版;

    *页码:P5

    *young-youth 写于:2018年3月16日15:25:13

目录

复用具体实现

复用的两种实现:组合继承

组合

        组合还有一种特殊情况:书上说:如果组合是动态发生的,则称之为 聚合 ;

        说明下动态发生的意思

       首先了解下面向对象中,类与类之间的关系:泛化(向上转型)、关联(组合、聚合)、依赖(继承)几种;

       组合和聚合,都属于关联,但是二者还是有区别的;其中,关联涉及整体类和局部类;而局部类与整体类的关系,就是区分组合与聚合的关键,组合中,整体类对象与局部类的对象生命周期相当,当创建完整体类对象后,就会创建局部类对象,可以理解为局部类是整体类的成员对象,并且这个对象,在定义的时候,就被创建;

       聚合,局部类对象的生命周期和整体类对象得生命周期不一致,可以理解为局部类是整体类的成员对象,但是这个对象,在定义的时候,并未被创建,而是在需要的时候,才被创建;,这也就是动态的意思,动态发生关联,而不是一开始就发生关联!

优点(是什么):

1.隐藏实现细节、耦合低

2.可以动态修改成员,灵活的一比

分析(为什么):

       先是想一个场景:我在写一个功能类A,实现某个复杂的功能,碰巧有一个功能类B,它的一些方法是我们A类需要实现的,我们为了简化代码,就选择复用B类的这一部分方法;假设B类中的Method_b()方法,是我们需要的;
        先使用组合来复用:        组合,使得我们的A类中,有一个私有化的B类的对象,我们在A类中封装一个Method_a()方法,该方法底层就是调用B类的Method_b()方法;B类其他的方法,我们A类不需要知道,也无法知道,因为,我们使用的是组合,A类中包含一个B类的对象,不同类的对象间,是无法得知非public的信息的;
       假设后期,B类的Method_b()的实现改动了,我们A类也不需要去管他,随他怎么改;或者B类发生了变化,增加新的方法,我们A类还是不用去管他;因为,这些改动对我们A类来说,都是看不见的,不影响我们的A类;这就是所谓隐藏实现细节
       假如B类多个实现的子类,每个子类都有Method_b()方法,我们就可以在程序运行期间,根据需要,动态的设置B类对象,到底是哪一个B类的具体实现;这和动态组合是一样的,此所谓灵活,动态修改成员

后记:

       所谓的隐藏细节,不是指隐藏所以的实现细节,这是基本不存在的,你总得暴露一些东西出去,供别人使用;而是指,我想给你什么,就给你什么,不想给你的,你就拿不到!

       并且,我方法怎么实现的,你也不用管,后期我可以随意改变方法的实现,使用组合,反正对你提供的,只是一个类似于接口的存在,即使打开源码看这个方法,也只能看到我用了哪个类;

继承

这里只讨论,对比组合,继承的缺点;

缺点(是什么)

1.破坏封装
2. 耦合高
3. 不够灵活,不能动态继承

分析(为什么)

       还是用组合那里举例子的场景;

       继承,子类完全继承父类的公开接口,父类的实现细节对子类是可见的,这就破坏了封装性;

       继承,在编译时就确定了,继承谁,不能像组合那样,动态修改;不灵活

     每当父类B添加新的方法的时候,无论是否是我们A类所需要的,A类都会被被迫继承;B类改动任何代码,都会影响到子类A,牵一发而动全身;耦合度太高

结论:在组合和继承都可以的情况下,必须选择组合!


原文地址:https://www.cnblogs.com/young-youth/p/11665750.html