一. 合成复用原则的定义

合成复用原则(Composite Reuse Principle,CRP)又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)。

它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

如果要使用继承关系,则必须严格遵循里式替换原则。合成复用原则同里式替换原则相辅相成,两者都是开闭原则的具体实现规范;

1. 核心思想

1)找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;

2)针对接口编程,而不是针对实现编程;

3)为了交互对象之间的松耦合设计而努力;

2. 重要性

通常类的复用分为 继承复用 和 合成复用 两种,继承复用虽然有简单和易实现的优点,但它也存在以下缺点:

1. 继承复用破坏了类的封装性。它将父类的实现细节暴露给子类,父类对子类是透明的,故这种复用又称为“白箱”复用。

2. 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。

3. 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。

采用 组合或聚合复用 时,可将已有对象纳入新对象中,使之成为新对象的一部分,新对象可调用已有对象的功能,它有以下优点:

1. 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。

2. 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。

3. 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。

二. 实现方法

合成复用原则是通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能从而达到复用。

三. 实例

下面以汽车分类管理程序为例来介绍合成复用原则的应用。

汽车分类管理程序

1. 分析:汽车按“动力源”划分可分为汽油汽车、电动汽车等;按“颜色”划分可分为白色汽车、黑色汽车和红色汽车等。如果同时考虑这两种分类,其组合就很多。图 1 所示是用继承关系实现的汽车分类的类图。

从图 1 可以看出用继承关系实现会产生很多子类,而且增加新的“动力源”或者增加新的“颜色”都要修改源代码,这违背了开闭原则,

显然不可取。但如果改用组合关系实现就能很好地解决以上问题,其类图如图 2 所示。

2.代码示例

fun main() {val gasolineCar = GasolineCar(Color(Color.RED))gasolineCar.display()val electricCar = ElectricCar(Color(Color.WHITE))electricCar.display()
}class Color (var colorDes:String){companion object{val BLACK = "BLACK"val WHITE = "WHITE"val RED ="RED"}
}abstract class Car(protected open var color: Color=Color(Color.WHITE)) {abstract fun move()abstract fun display()
}class GasolineCar(override var color: Color):Car(color){override fun move() {}override fun display() {println("this is a ${color.colorDes} gasolineCar")}
}class ElectricCar(override var color: Color):Car(color){override fun move() {}override fun display() {println("this is a ${color.colorDes} electricCar")}
}

程序的运行结果如下:

this is a RED gasolineCar
this is a WHITE electricCar

四. 七大架构设计原则

各种原则要求的侧重点不同,下面我们分别用一句话归纳总结软件设计模式的七大原则,如下表所示。

设计原则

一句话归纳

目的

开闭原则(OCP)

对扩展开放,对修改关闭

降低维护带来的新风险

依赖倒置原则(DIP)

高层不应该依赖底层,要面向接口编程

更利于代码结构的升级扩展

单一职能原则(SRP)

一个类只干一件事,实现类要单一(封装)

便于理解,提高代码的可读性

接口隔离原则(ISP)

一个接口只干一件事,接口要精简单一(接口粒度小)

功能解耦,高内聚、低耦合

迪米特法则(LoD)

不该知道的不要知道,一个类应保持对其他对象最少的了解

只和直接朋友交流,不和陌生人说话

里氏替换原则(LSP)

不要破坏继承体系,子类重写方法功能不应影响父类方法的含义

防止继承泛滥

合成复用原则(CRP)

尽量使用组合或聚合关系实现代码复用,少使用继承

降低代码耦合 将is 转换成 has

实际上,这些原则的目的只有一个:降低对象之间的耦合,增加程序的可复用性、可扩展性和可维护性。

记忆口诀:访问加限制,函数要节俭,依赖不允许,动态加接口,父类要抽象,扩展不更改。

在程序设计时,我们应该将程序功能最小化,每个类只干一件事。若有类似功能基础之上添加新功能,则要合理使用继承。对于多方法的调用,要会运用接口,同时合理设置接口功能与数量。最后类与类之间做到低耦合高内聚。

4.7 合成复用原则相关推荐

  1. 设计模式-合成复用原则

    2019独角兽企业重金招聘Python工程师标准>>> 合成复用原则: 尽量使用对象组合, 而不是继承来达到复用的目的. 合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和 ...

  2. 【设计模式】软件设计七大原则 ( 合成复用原则 | 代码示例 )

    文章目录 一.合成复用原则简介 二.合成复用 与 继承复用 优缺点 三.合成复用原则代码示例 1.继承复用代码示例 2.合成复用代码示例 一.合成复用原则简介 合成复用原则 又称为 组合复用原则 , ...

  3. 软件设计原则——合成复用原则

    合成复用原则是指:尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现. 通常类的复用分为继承复用和合成复用两种. 继承复用虽然有简单和易实现的优点,但它也存在以下缺点: 继承复用破坏 ...

  4. 合成复用原则java实例_第7节 合成复用原则

    ## 一.定义 合成/聚合复用原则是**在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的**. 简述为:**要尽量使用合成/聚合,尽量不 ...

  5. [设计模式]合成复用原则

    合成复用原则:继承和组合,优先使用组合. 这样写,每开一种车,就要弄一个新的Person类. 代码如下: #include <iostream> using namespace std;c ...

  6. 融会贯通——最常用的面向对象设计原则“合成复用原则”

    复用一个类的时候,多使用对象的组合/聚合的关联关系,而不是继承. 之前提到的"依赖倒转原则",是以里氏代换原则为基础的实现开闭原则目标的手段,这一条路线涉及到的是类的继承(包括单继 ...

  7. 设计模式的七大设计原则:其七:合成复用原则

    合成复用原则(Composite Reuse Principle) 基本介绍: 原则是尽量使用合成/聚合的方式,而不是使用继承. 设计原则核心思想: 1.找出应用中可能需要变化之处,把它们独立出来,不 ...

  8. 【设计模式】设计原则:CARP 合成复用原则

    合成复用原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使用对象组合(has-a)/聚合(contanis-a),而不是继承关系达到软件复用的目的.可以 ...

  9. 07.合成复用原则(Composite/Aggregate Reuse Principle,CARP)

    1.定义 指尽量使用对象 组合(has-a)/聚合(contanis-a),而不是继承关系达到软件复用的目的 继承我们叫做白箱复用,相当于把所有的实现细节暴露给子类.组合/聚合也称之为黑箱复用,对类以 ...

最新文章

  1. 目前的Android恶意软件分类
  2. transformer工程实现笔记
  3. 解决IOS ATS禁止HTTP明文传输
  4. java 正则 最后一个字符_正则表达式怎么匹配字符串中最后一串数字?
  5. 142_Power BI之同比预测
  6. js 控制鼠标_原生js实现改变视频播放速率
  7. 王佩丰 Excel 24节课 学习笔记
  8. python 基于模板生成ppt_【Python3】通过模板实现PPT的自动生成
  9. 免费使用中国知网/查看外文文献—浙江图书馆
  10. 基于DOI码的批量文献下载脚本
  11. 基于Krpano的全景导游系统设计与实现(含word文档)
  12. 虚拟机服务器都使用的机械硬盘吗,云服务器 有机械硬盘吗
  13. java毕业设计——基于java+图像处理技术的医学图像处理系统设计与实现(毕业论文+程序源码)——医学图像处理系统
  14. Colliding Mice碰撞老鼠工程分析
  15. 共享网络打印机无法连接计算机,共享打印机连不上的解决方法-电脑自学网
  16. numpy.ndarray类型方法
  17. 红盟过客 我与linux的故事
  18. 有多少域名被漏掉了?
  19. 操作系统抖动(颠簸)
  20. 华为云计算HCIE之oceanstor仿真器的安装教程

热门文章

  1. 职称计算机cad考试 多少分通过,2017职称计算机考试AutoCAD知识之直线的绘制
  2. python怎么输入空行_python如何添加空行
  3. 计算机自动执行的条件是,电脑中winsat.exe进程总会自动运行的解决方法
  4. excel隔行填充颜色的三种方法
  5. android cad插件下载,CAD看图大师下载
  6. 基于深度学习的图像识别进展:百度的若干实践
  7. PackageManagerService Android 8.1 源码解读 02
  8. imToken的创始人何斌:让区块链泛式革命在社区蔓延开来
  9. 〖每天学点管理〗——GTD时间管理
  10. Coprime Triples——CodeChef - COPRIME3