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

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

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

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

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

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

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

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

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

转载于:https://www.cnblogs.com/Evsward/p/CRP.html

融会贯通——最常用的面向对象设计原则“合成复用原则”相关推荐

  1. 相亲交友源码的架构设计,合成复用原则的实现

    合成复用原则是指尽量使用对象组合/聚合而不是继承关系达到相亲交友源码复用的目的.可以使相亲交友源码系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少. 继承叫作白箱复用,相当 ...

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

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

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

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

  4. 设计原则-合成复用原则

    简介 定义:尽量使用对象组合/聚合,而不是继承关系达到软件复用的目的. 聚合has-A和组合contains-A. 优点:可以使系统更加灵活,降低类与类之间的耦合度,一个雷的变化对其他类造成的影响相对 ...

  5. 面向对象软件设计原则【JAVA】(开闭原则、里氏代换、依赖倒转、接口隔离、迪米特法则、合成复用原则)

    软件设计原则[JAVA](开闭原则.里氏代换.依赖倒转.接口隔离.迪米特法则.合成复用原则) 1.开闭原则 2.里氏代换原则 3.依赖倒转原则 4.接口隔离原则 5.迪米特法则 6.合成复用原则 1. ...

  6. 7个常用的面向对象设计原则

    1 单一职责原则 单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小. 定义:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中. 单一职责原则的另一种定义方式:就一个类而言, ...

  7. 设计模式-合成复用原则-》面向对象设计原则

    合成复用原则是面向对象设计原则的 7 条原则中剩下的最后一条,下面我们将对其进行详细地介绍. 合成复用原则的定义 合成复用原则(Composite Reuse Principle,CRP)又叫组合/聚 ...

  8. 面向对象设计原则之合成复用原则

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

  9. 软件设计原则 —— 迪米特原则和合成复用原则

    迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的 ...

最新文章

  1. Android 中 include的使用
  2. 苹果AirTag遭破解,网友放出“教程”,可重写程序,可能成为恶意跟踪“神器”...
  3. flannel源码分析--LookupExtIface
  4. 开放中国农业-国际农民丰收节贸易会:谋定全球共同发展
  5. Server2012R2 ADFS3.0 The same client browser session has made '6' requests in the last '13'seconds
  6. 浅淡Kubernetes 与容器技术体系的最佳方法
  7. 如何确保您的Progressive Web App保持其Lighthouse审核分数
  8. Python删除文件、删除文件夹
  9. [芯片] 2、接口技术·实验二·定时/计数器8253
  10. 【渝粤教育】国家开放大学2018年秋季 0538-21T社区护理 参考试题
  11. Python深度学习
  12. 马克笔字体软件测试,广东文艺职业学院2017年公开招聘专业技能测试试题
  13. sublime text 编辑器批量删除空白行
  14. ps画画模糊笔刷_Photoshop绘图工具之模糊/锐化/涂抹工具
  15. 1.3.13 路由器 RIP 动态路由配置
  16. oracle获取每月的第一天和最后一天
  17. 绝缘检测电路方案:发现问题→分析问题→解决问题全过程
  18. AD fanout 各选项说明
  19. Gitlab安装使用及汉化配置
  20. NBA篮球图文直播室之数据排行榜设计

热门文章

  1. HTTP Status 500 - An exception occurred processing JSP page /common/../left.jsp at line 20
  2. 公司邮箱发邮件的util类
  3. sql server分页
  4. php不常用,却很实用的6个字符串函数
  5. 《who Who Are You Working For》(你在为谁工作)
  6. BGP进阶学习之RR与peer-group
  7. WPF Unleashed Chapter 2:XAML Demystified 翻译(第二部分)
  8. java部署到服务器乱码_java web项目发布到linux服务器上运行出现乱码
  9. anaconda moviepy_Anaconda的安装和Jupyter Notebook使用
  10. hive表级权限控制_数据库权限管理:表、行、列级别的权限控制