[设计模式] 浅谈组合/聚合复用原则
组合/聚合复用原则
原则说明:组合/聚合复用原则(Composite/Aggregate Reuse Principle,CARP),尽量使用对象的组合/聚合关系达到代码复用的目的,而不是使用继承关系。
为什么要遵守该原则
该原则是为了让使系统更加灵活,降低类与类之间的耦合度,一个类的变化不会对其他类造成影响。其优点如下:
- 维护了类的封装性,因为成员对象的内部细节对于新对象不可见,因此这种复用又被称为 “黑箱”复用。
- 新旧类之间的耦合度低,新对象操作成员对象的唯一方法是通过操作成员对象暴露的接口。
- 复用的灵活性高,这种复用可以在运行期间动态进行,新对象可以动态引用与成员对象类型相同的对象。
用一个简单的例子说明
class Engine {
// 引擎类
}
class Wheel {
// 轮子类
}
class Car {
private Engine engine; // 聚合关系,汽车和引擎的生命周期可以不一致
private Wheel wheel; // 聚合关系,汽车和轮子的生命周期可以不一致
public Car(Engine engine, Wheel wheel) {
this.engine = engine;
this.wheel = wheel;
}
}
Car类与Engine类、Wheel类之间是聚合关系,Car类有Engine和Wheel的实例,但是Engine和Wheel的生命周期并不依赖于Car,它们可以独立存在。这样如果Engine类或Wheel类发生变化,不会影响到Car类。
总结
按照组合/聚合复用原则,我们在复用组件设计时,尽量使用组合/聚合关系进行复用,使用继承关系复用时,应该严格遵守里氏替换原则,必须满足 “IS-A” 关系的才能使用继承。