定义:
- 尽量使用对象组合/聚合,而不是继承关系达到软件复用的目的;
- 聚合has-A和组合contains-A;
- 优点:可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响较少;
聚合has-A
聚合关系中代表部分事务的对象与代表聚合事务的对象,生命周期无关,即使删除了聚合对象,也不一定删除了部分对象;
举例:A类中引用了B类的对象,当A类被垃圾回收器回收后,B类的对象(还有其他对象引用)因为还有类引用就不会被回收。
组合contains-A
组合关系中代表部分事务的对象与代表组合事务的对象,生命周期有关,删除了组合对象,也就删除了部分对象;
举例:A类中引用了B类的对象,当A类被垃圾回收器回收后,B类的对象(没有其他对象引用)因为没有类引用也就被回收。
继承复用与合成/聚合复用
1. 继承复用
- 定义
继承复用通过扩展一个已有对象的实现来得到新的功能,基类明显地捕获共同的属性和方法,而子类通过增加新的属性和方法来扩展父类的实现。继承是类型的复用。
- 继承复用的优点
新的实现较为容易,因为超类的大部分功能可通过继承关系自动进入子类
修改或扩展继承而来的实现较为容易
- 继承复用的缺点
继承复用破坏封装,因为继承将细节暴露给子类
如果父类的实现发生改变,那么子子类的实现也不得不发生改变
从父类继承而来的实现是静态的,不可能在运行时间内发生改变,因此没有足够的灵活性
2. 合成/聚合复用
- 定义
由于合成/聚合可以将已有对象纳入到新对象中,使之成为新对象的一部分,所以新对象可以调用已有对象的功能
- 优点
该复用支持封装
该复用所需的依赖较少
每个新的任务可将焦点集中在一个任务上
- 缺点
通过这种复用建造的系统会有较多的对象需要管理
为了能将多个不同的对象作为组合块来使用,必须仔细地对接口进行定义