设计模式七大原则之合成复用原则(Composite Reuse Principle)

合成复用原则(CRP:Composite Reuse Principle)又称为组合/聚合复用原则(CARP:Composition/Aggregate Reuse Principle,),该原则指出尽量使用合成/聚合,尽量不要使用类继承。

在面向对象设计中,其中一个很重要的目标 就是提高软件的高可复用性。而复用已有的设计和实现通常有两种方法,也就是上面提到的,通过组合/聚合关系或通过继承。但是,合成复用原则主张优先考虑使用组合/聚合的方式来达到复用的目的。
为什么要这么主张呢?
实际上在《设计模式七大原则之里氏代换原则(Liskov Substitution Principle)》一文中,我们就提到继承实际上是增强了两个类耦合性,子类在继承基类时,会将基类的实现细节暴露给子类,基类的内部细节通常对子类来说是可见的,其实这种复用又叫作**“白箱”复用**。这种复用容易在“不知情”的情况下破坏系统的封装性,所以遵循里氏代换原则,我们优先通过聚合,组合,依赖等方式来解决问题。
组合/聚合复用有什么好处?
通过组合或聚合达到复用目的的做法实际上是,将已有的成员对象加入到新的对象中,让其成为新对象的一部分,而不破坏原有对象的封装,这样使得成员对象的内部细节不会暴露给新对象,所需的依赖较少,相对于继承复用来说,这种方式降低了耦合性,这种复用又叫作**“黑箱”复用**。

合成:表示一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。
合成关系用实心的菱形+实线来表示,如下图:
Composition
聚合:表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B对象并不是A对象的一部分。
聚合关系用空心的菱形+实线来表示,如下图:
Aggregate

合成/聚合复用原则在设计模式中最好的体现就是桥接(Bridge)模式,后面介绍设计模式时再继续介绍。

附:本次演示的项目地址
https://github.com/syshlang/java-design-principle