面向对象设计的原则之“合成/聚合复用原则”

出处:

http://blog.sina.com.cn/s/blog_6233e22a0100fcat.html

合成/聚合复用原则(Composite/Aggregate Reuse PrincipleCARP

定义:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的目的。

应首先使用合成/聚合,合成/聚合则使系统灵活,其次才考虑继承,达到复用的目的。而使用继承时,要严格遵循里氏代换原则。有效地使用继承会有助于对问题的理解,降低复杂度,而滥用继承会增加系统构建、维护时的难度及系统的复杂度。

 

如果两个类是“Has-a”关系应使用合成、聚合,如果是“Is-a”关系可使用继承。"Is-A"是严格的分类学意义上定义,意思是一个类是另一个类的"一种"。而"Has-A"则不同,它表示某一个角色具有某一项责任。

 

4.2什么是合成?什么是聚合?

合成(Composition)和聚合(Aggregation)都是关联(Association)的特殊种类。

聚合表示整体和部分的关系,表示拥有。如奔驰S360汽车,对奔驰S360引擎、奔驰S360轮胎的关系是聚合关系,离开了奔驰S360汽车,引擎、轮胎就失去了存在的意义。在设计中, 聚合不应该频繁出现,这样会增大设计的耦合度。

合成则是一种更强的拥有,部分和整体的生命周期一样。合成的新的对象完全支配其组成部分,包括它们的创建和湮灭等。一个合成关系的成分对象是不能与另一个合成关系共享的。

换句话说,合成是值的聚合(Aggregation by Value),而一般说的聚合是引用的聚合(Aggregation by Reference)。

明白了合成和聚合关系,再来理解合成/聚合原则应该就清楚了,要避免在系统设计中出现,一个类的继承层次超过3层,则需考虑重构代码,或者重新设计结构。当然最好的办法就是考虑使用合成/聚合原则。

 

4.3通过合成/聚合的优缺点

优点:

1) 新对象存取成分对象的唯一方法是通过成分对象的接口。

2) 这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不见的。

3) 这种复用支持包装。

4) 这种复用所需的依赖较少。

5) 每一个新的类可以将焦点集中在一个任务上。

6) 这种复用可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象。

7) 作为复用手段可以应用到几乎任何环境中去。

 

缺点:就是系统中会有较多的对象需要管理。

4.4通过继承来进行复用的优缺点

优点:

新的实现较为容易,因为超类的大部分功能可以通过继承的关系自动进入子类。

修改和扩展继承而来的实现较为容易。

缺点:

继承复用破坏包装,因为继承将超类的实现细节暴露给子类。由于超类的内部细节常常是对于子类透明的,所以这种复用是透明的复用,又称白箱复用。

如果超类发生改变,那么子类的实现也不得不发生改变。

从超类继承而来的实现是静态的,不可能在运行时间内发生改变,没有足够的灵活性。

继承只能在有限的环境中使用。

你可能感兴趣的:(面向对象)