合成聚合复用原则汇.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
合成聚合复用原则汇

合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP) 合成(Composition)和聚合(Aggregation)都是关联(Association)的特殊种类。 聚合表示整体和部分的关系,表示“拥有”。如奔驰S360汽车,对奔驰S360引擎、奔驰S360轮胎的关系是聚合关系,离开了奔驰S360汽车,引擎、轮胎就失去了存在的意义。在设计中,聚合不应该频繁出现,这样会增大设计的耦合度。 合成则是一种更强的“拥有”,部分和整体的生命周期一样。合成的新的对象完全支配其组成部分,包括它们的创建和湮灭等。一个合成关系的成分对象是不能与另一个合成关系共享的。 ??? 换句话说,合成是值的聚合(Aggregation by Value),而一般说的聚合是引用的聚合(Aggregation by Reference)。 在面向对象设计中,有两种基本的办法可以实现复用: 第一种是通过合成/聚合,即合成复用原则,含义是指,尽量使用合成/聚合,而不是使用继承。 第二种就是通过继承。 要正确地选择合成/复用和继承的方法是,只有当以下的条件全部被满足时,才应当使用继承关系: 1)子类是父类的一个特殊种类,而不是父类的一个角色,也就是区分Has-A和Is-A。只有Is-A关系才符合继承关系,Has-A关系应当用聚合来描述。 2)永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定将来是否会变成另外一个子类的话,就不要使用继承。 3)子类具有扩展父类的责任,而不是具有置换掉(override)或注销掉(Nullify)父类的责任。如果一个子类需要大量的置换掉父类的行为,那么这个类就不应该是这个父类的子类。 4)只有在分类学角度上有意义时,才可以使用继承。 如果语义上存在着明确的is-a关系,并且这种关系是稳定的、不变的,则考虑使用继承;如果没有is-a关系,或者这种关系是可变的,使用合成。 错误的使用继承而不是合成 / 聚合的一个常见原因是错误的把 “Has-A” 当成了 “Is - A” 。 “Is - A” 代表一个类是另外一个类的一种; “Has-A” 代表一个类是另外一个类的一个角色,而不是另外一个类的特殊种类。 我们看一个例子。如果我们把 “ 人 ” 当成一个类,然后把 “ 雇员 ” , “ 经理 ” , “ 学生 ” 当成是 “ 人 ” 的子类。这个的错误在于把 “ 角色 ” 的等级结构和 “ 人 ” 的等级结构混淆了。 “ 经理 ” , “ 雇员 ” , “ 学生 ” 是一个人的角色,一个人可以同时拥有上述角色。如果按继承来设计,那么如果一个人是雇员的话,就不可能是学生,这显然不合理。正确的设计是有个抽象类 “ 角色 ” , “ 人 ” 可以拥有多个 “ 角色 ” (聚合), “ 雇员 ” , “ 经理 ” , “ 学生 ” 是 “ 角色 ” 的子类。 另外一个就是只有两个类满足里氏替换原则的时候,才可能是 “Is - A” 关系。也就是说,如果两个类是 “Has-A” 关系,但是设计成了继承,那么肯定违反里氏替换原则。 通过合成/聚合的优缺点 优点: 1) 新对象存取子对象的唯一方法是通过子对象的接口。 2) 这种复用是黑箱复用,因为子对象的内部细节是新对象所看不见的。 3) 这种复用更好地支持封装性。 4) 这种复用实现上的相互依赖性比较小。 5) 每一个新的类可以将焦点集中在一个任务上。 6) 这种复用可以在运行时间内动态进行,新对象可以动态的引用与子对象类型相同的对象。 7) 作为复用手段可以应用到几乎任何环境中去。 缺点:?就是系统中会有较多的对象需要管理。 4.4?通过继承来进行复用的优缺点 ???点: 新的实现较为容易,因为父类的大部分功能可以通过继承的关系自动进入子类。 修改和扩展继承而来的实现较为容易。 ??? ?缺点: 继承复用破坏封装性,因为继承将父类的实现细节暴露给子类。由于父类的内部细节常常是对于子类透明的,所以这种复用是透明的复用,又称“白箱”复用。 如果父类发生改变,那么子类的实现也不得不发生改变。 从父类继承而来的实现是静态的,不可能在运行时间内发生改变,没有足够的灵活性。

文档评论(0)

hhuiws1482 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档