*来自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,牵一发而动全身;
耦合度太高