合成聚合复用原则_第1页
合成聚合复用原则_第2页
合成聚合复用原则_第3页
合成聚合复用原则_第4页
合成聚合复用原则_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)合成(Composition)和聚合(Aggregation)都是关联(Association)的特殊种类。聚合表示整体和部分的关系,表示“拥有”。如奔驰S360汽车,对奔驰S360引擎、奔驰S360轮胎的关系是聚合关系,离开了奔驰S360汽车,引擎、轮胎就失去了存在的意义。在设计中,聚合不应该频繁出现,这样会增大设计的耦合度。合成则是一种更强的“拥有”,部分和整体的生命周期一样。合成的新的对象完全支配其组成部分,包括它们的创建和湮灭等。一个合成关系的成分对象是不能与另一个合成关系共享的。 换

2、句话说,合成是值的聚合(Aggregation by Value),而一般说的聚合是引用的聚合(Aggregation by Reference)。在面向对象设计中,有两种基本的办法可以实现复用:第一种是通过合成/聚合,即合成复用原则,含义是指,尽量使用合成/聚合,而不是使用继承。第二种就是通过继承。要正确地选择合成/复用和继承的方法是,只有当以下的条件全部被满足时,才应当使用继承关系:1)子类是父类的一个特殊种类,而不是父类的一个角色,也就是区分Has-A和Is-A。只有Is-A关系才符合继承关系,Has-A关系应当用聚合来描述。2)永远不会出现需要将子类换成另外一个类的子类的情况。如果不能

3、肯定将来是否会变成另外一个子类的话,就不要使用继承。3)子类具有扩展父类的责任,而不是具有置换掉(override)或注销掉(Nullify)父类的责任。如果一个子类需要大量的置换掉父类的行为,那么这个类就不应该是这个父类的子类。4)只有在分类学角度上有意义时,才可以使用继承。如果语义上存在着明确的is-a关系,并且这种关系是稳定的、不变的,则考虑使用继承;如果没有is-a关系,或者这种关系是可变的,使用合成。错误的使用继承而不是合成 / 聚合的一个常见原因是错误的把 “Has-A” 当成了 “Is A” 。 “Is A” 代表一个类是另外一个类的一种; “Has-A” 代表一个类是另外一个类

4、的一个角色,而不是另外一个类的特殊种类。 我们看一个例子。如果我们把 “ 人 ” 当成一个类,然后把 “ 雇员 ” , “ 经理 ” , “ 学生 ” 当成是 “ 人 ” 的子类。这个的错误在于把 “ 角色 ” 的等级结构和 “ 人 ” 的等级结构混淆了。 “ 经理 ” , “ 雇员 ” , “ 学生 ” 是一个人的角色,一个人可以同时拥有上述角色。如果按继承来设计,那么如果一个人是雇员的话,就不可能是学生,这显然不合理。正确的设计是有个抽象类 “ 角色 ” , “ 人 ” 可以拥有多个 “ 角色 ” (聚合), “ 雇员 ” , “ 经理 ” , “ 学生 ” 是 “ 角色 ” 的子类。 另

5、外一个就是只有两个类满足里氏替换原则的时候,才可能是 “Is A” 关系。也就是说,如果两个类是 “Has-A” 关系,但是设计成了继承,那么肯定违反里氏替换原则。通过合成/聚合的优缺点优点:1) 新对象存取子对象的唯一方法是通过子对象的接口。2) 这种复用是黑箱复用,因为子对象的内部细节是新对象所看不见的。3) 这种复用更好地支持封装性。4) 这种复用实现上的相互依赖性比较小。5) 每一个新的类可以将焦点集中在一个任务上。6) 这种复用可以在运行时间内动态进行,新对象可以动态的引用与子对象类型相同的对象。7) 作为复用手段可以应用到几乎任何环境中去。缺点:就是系统中会有较多的对象需要管理。4.4通过继承来进行复用的优缺点优点:新的实现较为容易,因为父类的大部分功能可以通过继承的关系自动进入子类。修改和扩展继承而来的实现较为容易。 缺点:继承复用破坏封装性,因为继承将父类的实现细节暴露给子类。由于父类的内部细节常常是对于子类透明的,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论