复用一个类的时候,多使用对象的组合/聚合的关联关系,而不是继承。

之前提到的“依赖倒转原则”,是以里氏代换原则为基础的实现开闭原则目标的手段,这一条路线涉及到的是类的继承(包括单继承和接口实现),他们支撑了Java多态的特性。

但是今天要谈一谈Java另一个特性——封装。封装就是不要暴露过多的基类内部细节给子类,让高层的操作神秘起来,不让小兵知道。合成复用原则体现的就是封装的特性。

所以可以推论出,多使用对象的组合/聚合关系,而不是继承,从而实现不会暴露过多的基类操作细节给子类的目的。

那么组合和聚合是什么?他们和继承有什么区别?他们各自之间又有什么区别呢?

先说结论,相对于组合和聚合之间的区别,他们和继承之间的区别更大。

  • 组合和聚合都是在一个对象(相当于子类)中把另一个类(相当于基类)的对象当做其成员对象,这和继承比起来,关系要弱化很多,降低了耦合度,“子类”并不需要明显的继承和实现的关键字出现,它并不值得作为成员对象的“基类”的对象内部都实现了些什么,它的成员变量又是什么,即使“基类”的内部进行了修改,代码重构,对于“子类”来说并不需要做任何改动。
  • 组合和聚合的区别可以从语言学上来讲:组合是很多部分组成了一个东西,聚合是很多东西聚在一起。这样就十分清晰了,好比一个狼类,它肯定有脚类对象,头类对象,爪子类对象等作为其成员对象,这就是组合关系。那么狼群类,它肯定是有狼类作为其成员对象,而不会有狼自身的什么脚类对象、头类对象等,这就是聚合。要根据这些原则去设计程序,而不是模式,特性用得越多越好,用得不恰当反而会增加系统的复杂度,降低系统可维护性。这些模式,继承,封装等等就像是工具箱里面的十字花螺丝刀,一字螺丝刀,剪刀等,在干活的时候,要根据活的情况去选择螺丝刀还是剪刀,还是都要用。而不是一味地使用十字花螺丝刀,干遍天下的活。没有万能工具,因为我们还有“单一指责原则”,“接口隔离原则”,要去拆分功能,让每个工具功能单一化,也就是追求深度(可以把十字花螺丝刀那个头做的结实点),不追求广度(而不是既能当螺丝刀又能当剪刀)。有朋友提出,那瑞士军刀呢,它可谓是多功能的?瑞士军刀的多功能性更像是一个小型工具箱,不要把它当做是一个单一的工具,瑞士军刀类里面有很多聚合来的螺丝刀类的对象,小剪刀类的对象,所以,瑞士军刀其实也是“单一职责原则”,“合成复用原则”的体现,他就是将各种模式,特性运用的非常得体的一个好产品。

那么具体什么“活”的时候要用继承,什么“活”的时候用组合/聚合的关联关系呢?

请记住:继承一定是描述“Is-A”(它是它)的类之间的关系,而组合/聚合的关联关系一定是描述“Has-A”(它包含它)的类之间的关系。

融会贯通——最常用的“合成复用原则”技能点Get的更多相关文章

  1. 面象对象设计原则之七:合成复用原则(Composition/Aggregate Reuse Principle, CARP)

    合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, CARP),其定义如下: 合成复用原则(Composite Reuse Princi ...

  2. 设计模式 第一天 UML图,设计模式原则:开闭原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则,简单工厂模式

    1 课程大纲 2 UML的概述 总结: UML unified model language 统一建模语言 一共有十种图: 类图 用例图 时序图 * 对象图 包图 组件图 部署图 协作图 状态图 (最 ...

  3. DesignPattern系列__07合成复用原则

    基本介绍 合成复用原则的核心,就是尽量去使用组合.聚合等方式,而不是使用继承. 核心思想 1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,而不是 ...

  4. 设计模式课程 设计模式精讲 3-11 合成复用原则coding

    1 课堂概念 1.0 继承关系的选择 1.1 起名 1.2 定义 1.3 组合聚合优缺点 1.4 继承优缺点 1.5 组合聚合区别 2 代码演练 2.1 反例 2.2 正例 3 疑问解答3.1 疑问解 ...

  5. Java设计模式(4:里氏替换原则和合成复用原则详解

    一.里氏替换原则 如果说实现开闭原则的关键步骤就是抽象化,那么基类(父类)和子类的继承关系就是抽象化的具体实现,所以里氏替换原则就是对实现抽象化的具体步骤的规范.即:子类可以扩展基类(父类)的功能,但 ...

  6. 设计模式六大原则——合成/聚合复用原则(CARP)

    1.定义 简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承. 2.释义 为什么"要尽量使用合成和聚合.尽量不要使用继承"呢? 这是由于: 第一,继 ...

  7. Java设计模式——合成/聚合复用原则

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

  8. 设计模式原则(7)--Composition&AggregationPrinciple(CARP)--合成&聚合复用原则

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.定义:  要尽量使用合成和聚合,尽量不要使用继承. 2.使用场景: 要正确的选择合成/复用和继承,必须透彻地理 ...

  9. 《设计模式》-原则五:合成/聚合复用原则(CARP)

    这个也好理解 ,这个合成/聚合复用原则指的是在一个新的对象里面使用一些已有的对象,使其成为新对象的一部分.新对象通过委派达到复用已有功能的效果. 说到这里要讲提及到“Has-A” 和“Is-A”的区别 ...

随机推荐

  1. H5微信通过百度地图API实现导航方式一

    根据业务需求修改百度API,实现微信中的导航功能.因为源码中SearchInfoWindow_min.js有点小问题(部分小城市公交线路少,查不到路线时没有提示),所以这里在源码的基础上改了一点点.可 ...

  2. python-冒泡排序,升序、降序

    冒泡排序 这个算法的名字由来是因为越大的元素会经交换慢慢浮'到数列的顶端. 冒泡排序的基本思想:重复走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,直到没有再需要交换,完成排序 ...

  3. Python操作Zip文件

    Python操作Zip文件 需要使用到zipfile模块 读取Zip文件 随便一个zip文件,我这里用了bb.zip,就是一个文件夹bb,里面有个文件aa.txt. import zipfile # ...

  4. mysql-proxy读写分离

    实验环境: LAP+ 1.安装apache服务(192.168.2.131) yum install openssl-devel [root@LAP ~]# tar zxvf httpd-2.2.25 ...

  5. (转载)Stackoverflow评选的C++推荐书单

    C++必读书籍推荐 (原链接:http://bestcbooks.com/recommended-cpp-books 2013-10-07) 本文内容来自国外著名编程问答网站Stackoverflow ...

  6. appach-maven-3.5.0配置与下载

    今天需要搭建javaweb开发的环境,需要配置maven.弄了半天终于配置好了.蛋疼的一批.楼主用的是win10的系统.不知道Linux下的也是不是这么坑! 首先,需要把maven的包下载下来.进入h ...

  7. springMVC修改用户请求内容

    最近在做一个微信相关的网站,很多地方涉及到微信表情的输入,导致内容无法插入到数据库,虽然有用到一个表情过滤的工具类,但是需要过滤的地方比较多,于是想到在过滤器中过滤用户请求的内容. request这个 ...

  8. 【平板电脑模拟器】PC端-Chrome自带的功能

    直接说使用方式吧, 启动方法:打开Chrome浏览器--〉F12--〉右下角的齿轮按钮(Settings)--〉选择"Overrides" 然后在"Overrides&q ...

  9. Linux - 简明Shell编程05 - 条件语句(Case)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash var=$1 # 将脚本的第一 ...

  10. 在 WebSphere Application Server V7 集群环境中管理 HTTP session[阅读]

    http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1012_dingsj_wascluster/1012_ding ...