4.7 合成复用原则
一. 合成复用原则的定义
合成复用原则(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 合成复用原则相关推荐
- 设计模式-合成复用原则
2019独角兽企业重金招聘Python工程师标准>>> 合成复用原则: 尽量使用对象组合, 而不是继承来达到复用的目的. 合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和 ...
- 【设计模式】软件设计七大原则 ( 合成复用原则 | 代码示例 )
文章目录 一.合成复用原则简介 二.合成复用 与 继承复用 优缺点 三.合成复用原则代码示例 1.继承复用代码示例 2.合成复用代码示例 一.合成复用原则简介 合成复用原则 又称为 组合复用原则 , ...
- 软件设计原则——合成复用原则
合成复用原则是指:尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现. 通常类的复用分为继承复用和合成复用两种. 继承复用虽然有简单和易实现的优点,但它也存在以下缺点: 继承复用破坏 ...
- 合成复用原则java实例_第7节 合成复用原则
## 一.定义 合成/聚合复用原则是**在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的**. 简述为:**要尽量使用合成/聚合,尽量不 ...
- [设计模式]合成复用原则
合成复用原则:继承和组合,优先使用组合. 这样写,每开一种车,就要弄一个新的Person类. 代码如下: #include <iostream> using namespace std;c ...
- 融会贯通——最常用的面向对象设计原则“合成复用原则”
复用一个类的时候,多使用对象的组合/聚合的关联关系,而不是继承. 之前提到的"依赖倒转原则",是以里氏代换原则为基础的实现开闭原则目标的手段,这一条路线涉及到的是类的继承(包括单继 ...
- 设计模式的七大设计原则:其七:合成复用原则
合成复用原则(Composite Reuse Principle) 基本介绍: 原则是尽量使用合成/聚合的方式,而不是使用继承. 设计原则核心思想: 1.找出应用中可能需要变化之处,把它们独立出来,不 ...
- 【设计模式】设计原则:CARP 合成复用原则
合成复用原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使用对象组合(has-a)/聚合(contanis-a),而不是继承关系达到软件复用的目的.可以 ...
- 07.合成复用原则(Composite/Aggregate Reuse Principle,CARP)
1.定义 指尽量使用对象 组合(has-a)/聚合(contanis-a),而不是继承关系达到软件复用的目的 继承我们叫做白箱复用,相当于把所有的实现细节暴露给子类.组合/聚合也称之为黑箱复用,对类以 ...
最新文章
- 目前的Android恶意软件分类
- transformer工程实现笔记
- 解决IOS ATS禁止HTTP明文传输
- java 正则 最后一个字符_正则表达式怎么匹配字符串中最后一串数字?
- 142_Power BI之同比预测
- js 控制鼠标_原生js实现改变视频播放速率
- 王佩丰 Excel 24节课 学习笔记
- python 基于模板生成ppt_【Python3】通过模板实现PPT的自动生成
- 免费使用中国知网/查看外文文献—浙江图书馆
- 基于DOI码的批量文献下载脚本
- 基于Krpano的全景导游系统设计与实现(含word文档)
- 虚拟机服务器都使用的机械硬盘吗,云服务器 有机械硬盘吗
- java毕业设计——基于java+图像处理技术的医学图像处理系统设计与实现(毕业论文+程序源码)——医学图像处理系统
- Colliding Mice碰撞老鼠工程分析
- 共享网络打印机无法连接计算机,共享打印机连不上的解决方法-电脑自学网
- numpy.ndarray类型方法
- 红盟过客 我与linux的故事
- 有多少域名被漏掉了?
- 操作系统抖动(颠簸)
- 华为云计算HCIE之oceanstor仿真器的安装教程
热门文章
- 职称计算机cad考试 多少分通过,2017职称计算机考试AutoCAD知识之直线的绘制
- python怎么输入空行_python如何添加空行
- 计算机自动执行的条件是,电脑中winsat.exe进程总会自动运行的解决方法
- excel隔行填充颜色的三种方法
- android cad插件下载,CAD看图大师下载
- 基于深度学习的图像识别进展:百度的若干实践
- PackageManagerService Android 8.1 源码解读 02
- imToken的创始人何斌:让区块链泛式革命在社区蔓延开来
- 〖每天学点管理〗——GTD时间管理
- Coprime Triples——CodeChef - COPRIME3