融会贯通——最常用的“合成复用原则”技能点Get
复用一个类的时候,多使用对象的组合/聚合的关联关系,而不是继承。
之前提到的“依赖倒转原则”,是以里氏代换原则为基础的实现开闭原则目标的手段,这一条路线涉及到的是类的继承(包括单继承和接口实现),他们支撑了Java多态的特性。
但是今天要谈一谈Java另一个特性——封装。封装就是不要暴露过多的基类内部细节给子类,让高层的操作神秘起来,不让小兵知道。合成复用原则体现的就是封装的特性。
所以可以推论出,多使用对象的组合/聚合关系,而不是继承,从而实现不会暴露过多的基类操作细节给子类的目的。
那么组合和聚合是什么?他们和继承有什么区别?他们各自之间又有什么区别呢?
先说结论,相对于组合和聚合之间的区别,他们和继承之间的区别更大。
- 组合和聚合都是在一个对象(相当于子类)中把另一个类(相当于基类)的对象当做其成员对象,这和继承比起来,关系要弱化很多,降低了耦合度,“子类”并不需要明显的继承和实现的关键字出现,它并不值得作为成员对象的“基类”的对象内部都实现了些什么,它的成员变量又是什么,即使“基类”的内部进行了修改,代码重构,对于“子类”来说并不需要做任何改动。
- 组合和聚合的区别可以从语言学上来讲:组合是很多部分组成了一个东西,聚合是很多东西聚在一起。这样就十分清晰了,好比一个狼类,它肯定有脚类对象,头类对象,爪子类对象等作为其成员对象,这就是组合关系。那么狼群类,它肯定是有狼类作为其成员对象,而不会有狼自身的什么脚类对象、头类对象等,这就是聚合。要根据这些原则去设计程序,而不是模式,特性用得越多越好,用得不恰当反而会增加系统的复杂度,降低系统可维护性。这些模式,继承,封装等等就像是工具箱里面的十字花螺丝刀,一字螺丝刀,剪刀等,在干活的时候,要根据活的情况去选择螺丝刀还是剪刀,还是都要用。而不是一味地使用十字花螺丝刀,干遍天下的活。没有万能工具,因为我们还有“单一指责原则”,“接口隔离原则”,要去拆分功能,让每个工具功能单一化,也就是追求深度(可以把十字花螺丝刀那个头做的结实点),不追求广度(而不是既能当螺丝刀又能当剪刀)。有朋友提出,那瑞士军刀呢,它可谓是多功能的?瑞士军刀的多功能性更像是一个小型工具箱,不要把它当做是一个单一的工具,瑞士军刀类里面有很多聚合来的螺丝刀类的对象,小剪刀类的对象,所以,瑞士军刀其实也是“单一职责原则”,“合成复用原则”的体现,他就是将各种模式,特性运用的非常得体的一个好产品。
那么具体什么“活”的时候要用继承,什么“活”的时候用组合/聚合的关联关系呢?
请记住:继承一定是描述“Is-A”(它是它)的类之间的关系,而组合/聚合的关联关系一定是描述“Has-A”(它包含它)的类之间的关系。
融会贯通——最常用的“合成复用原则”技能点Get的更多相关文章
- 面象对象设计原则之七:合成复用原则(Composition/Aggregate Reuse Principle, CARP)
合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, CARP),其定义如下: 合成复用原则(Composite Reuse Princi ...
- 设计模式 第一天 UML图,设计模式原则:开闭原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则,简单工厂模式
1 课程大纲 2 UML的概述 总结: UML unified model language 统一建模语言 一共有十种图: 类图 用例图 时序图 * 对象图 包图 组件图 部署图 协作图 状态图 (最 ...
- DesignPattern系列__07合成复用原则
基本介绍 合成复用原则的核心,就是尽量去使用组合.聚合等方式,而不是使用继承. 核心思想 1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,而不是 ...
- 设计模式课程 设计模式精讲 3-11 合成复用原则coding
1 课堂概念 1.0 继承关系的选择 1.1 起名 1.2 定义 1.3 组合聚合优缺点 1.4 继承优缺点 1.5 组合聚合区别 2 代码演练 2.1 反例 2.2 正例 3 疑问解答3.1 疑问解 ...
- Java设计模式(4:里氏替换原则和合成复用原则详解
一.里氏替换原则 如果说实现开闭原则的关键步骤就是抽象化,那么基类(父类)和子类的继承关系就是抽象化的具体实现,所以里氏替换原则就是对实现抽象化的具体步骤的规范.即:子类可以扩展基类(父类)的功能,但 ...
- 设计模式六大原则——合成/聚合复用原则(CARP)
1.定义 简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承. 2.释义 为什么"要尽量使用合成和聚合.尽量不要使用继承"呢? 这是由于: 第一,继 ...
- Java设计模式——合成/聚合复用原则
一.什么是合成/聚合复用原则? 合成/聚合复用原则是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的. 简述为:要尽量使用合成/聚合,尽 ...
- 设计模式原则(7)--Composition&AggregationPrinciple(CARP)--合成&聚合复用原则
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.定义: 要尽量使用合成和聚合,尽量不要使用继承. 2.使用场景: 要正确的选择合成/复用和继承,必须透彻地理 ...
- 《设计模式》-原则五:合成/聚合复用原则(CARP)
这个也好理解 ,这个合成/聚合复用原则指的是在一个新的对象里面使用一些已有的对象,使其成为新对象的一部分.新对象通过委派达到复用已有功能的效果. 说到这里要讲提及到“Has-A” 和“Is-A”的区别 ...
随机推荐
- 一.CPU,Mem过高怎么办 --这是个开始
本身是名Java开发,在做了一段大数据的工作后,猛然间想对Java做个总结. 从未写过技术博客,一时不知如何开始,思虑后,暂且以自己喜爱的方式来开篇. 工作中遇到过CPU或内存过高的问题,解决步骤: ...
- strcpy.strcmp.strlen.strcat函数的实现
#include <stdio.h> #include <string.h> char *copy(char *a,char *b);//声明一个复制函数 char *ca ...
- vuex状态管理,state,getters,mutations,actons的简单使用(一)
之前的文章中讲过,组件之间的通讯我们可以用$children.$parent.$refs.props.data... 但问题来了,假如项目特别大,组件之间的通讯可能会变得十分复杂... 这个时候了我们 ...
- 安徽省2016“京胜杯”程序设计大赛_K_纸上谈兵
纸上谈兵 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 3 Accepted: 1 Description 战国时 ...
- Luogu P1001 A+B Problem
题目描述 输入两个整数a,b,输出它们的和(|a|,|b|<=10^9). 注意 1.pascal使用integer会爆掉哦! 2.有负数哦! 3.c/c++的main函数必须是int类型,而且 ...
- javascript的词法作用域
这个概念是js中相当基础也是极为重要的,很多想当然的错误或感觉怪异的问题都是和这个东西有关.所以,本文主要说下这个名词的概念以及讨论下他牵扯出来的有关变量.函数.闭包的问题. 由变量开始谈 习惯性先来 ...
- shell /bin/bash^M: bad interpreter错误解决
错误原因之一很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是M ...
- CTF中图片隐藏文件分离方法总结
0x00 前言 在安全的大趋势下,信息安全越来越来受到国家和企业的重视,所以CTF比赛场次越来越多,而且比赛形式也不断的创新,题目也更加新颖有趣,对选手的综合信息安全能力有一个较好的考验,当然更好的是 ...
- Fortran调用C语言小计
先简单记录下问题,以后再给续解决方案 1,关于fortran中module的使用 2,没有参数可以正常调用,当需要传递参数时,由于两者语言的差异,字符串结束符号不同,应该注意 3,关于调用C函数时,调 ...
- 获取token之后,再调用匿名方法
js获取token bpm.api.beginDownload = function (filePath, fileName) { var url = "/Home/GetToken&quo ...