zoukankan      html  css  js  c++  java
  • 面向对象设计的原则之“合成/聚合复用原则” (转)

    出处:

    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通过继承来进行复用的优缺点

    优点:

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

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

    缺点:

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

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

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

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

  • 相关阅读:
    DDL
    [笔记]NFC笔记——初始化RF碰撞避免
    [笔记]Java没有C语言的编译开关怎么办?
    [笔记]NFC笔记——通用初始化及单设备检测(SDD)流程
    [笔记]NFC笔记——NFCIP1协议命令集(NFCIP1 Protocol Command Set)
    [笔记]C++代码演示SingletonMap 单类Map实例
    [笔记]NFC笔记——传输帧格式
    [笔记]C++代码演示Singleton单类实例
    [笔记]山寨中文编程语言
    [笔记]NFC笔记——ATR_REQ 消息结构
  • 原文地址:https://www.cnblogs.com/y5042/p/2167069.html
Copyright © 2011-2022 走看看