面向对象编程时,有十条很重要的原则:

  • 代码复用
  • 封装变化
  • 开闭原则
  • 单一职责原则
  • 依赖注入/依赖倒置原则
  • 里氏替换原则(LSP)
  • 接口隔离原则(ISP)
  • 多用组合,少用继承
  • 面向接口编程
  • 委托原则

上图摘自《Head First - Java 设计模式》

本文列举“多用组合,少用继承”的五条原因。

1. Java 不支持多继承

Java 不支持多继承,这个限制导致只能其继承一个基类。如果想赋予一个类多个功能,选择只有两个:接口和组合。多个功能将以成员变量的形式存在于宿主类中。

2. 组合让测试更容易

单元测试的时候,我们需要 mock 数据。使用继承时,我们不得不 mock 基类。而使用组合,则简单很多。而且,我们可以通过注入不同的实例来方便的完成 mock 和线上实例的切换。

3. 现有设计模式辅证

在现有成熟的设计模式中,策略模式(Strategy design pattern)和装饰者模式(Decorator design pattern)都使用了组合的形式。

4. 继承不利于封装

在继承中,如果子类依赖父类的行为,子类将变得脆弱。因为一旦父类行为发生变化(代码结构或性能优化等原因引起的),子类也将受到影响。

5. 组合更具灵活性

使用组合,可以灵活的替换超类(基类或接口)的实现方案。比如 Java 中用于比较的接口 Comparator。以组合的形式使用 Comparator,可以通过 set 不同的实现来比较不同的实例来完成多种比较功能。

参考资料

  • 5 Reasons to Use Composition over Inheritance in Java and OOP
  • 10 Object Oriented Design Principles Java Programmer should know

为什么要多用组合少用继承?相关推荐

  1. 为何说要多用组合少用继承?

    在面向对象编程中,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承.为什么不推荐使用继承?组合相比继承有哪些优势?如何判断该用组合还是继承?今天,我们就围绕着这三个问题,来详细讲解一下 ...

  2. 理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?

    在面向对象编程中,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承.为什么不推荐使用继承?组合相比继承有哪些优势?如何判断该用组合还是继承?今天,我们就围绕着这三个问题,来详细讲解一下 ...

  3. 【Java设计模式 面向对象设计思想】五 多用组合少用继承编程

    我们经常会听到说多用组合少用继承,但是拜托,继承是面向对象四大特性之一啊,为什么地位反不如组合了呢,为什么不推荐使用继承?组合相比继承有哪些优势?如何判断该用组合还是继承?围绕这三个问题进行以下讨论 ...

  4. 在设计原则中,为什么反复强调组合要优于继承?

    今日推荐21 款 yyds 的 IDEA插件这 56 个代码注释让我笑吐了注解+反射优雅的实现Excel导入导出(通用版)Fluent Mybatis 牛逼!Nginx 常用配置清单这玩意比Threa ...

  5. 面向对象设计原则——优先使用对象组合,而不是继承(组合以及与继承的区别)

    看到面向对象设计原则中的合成复用原则: 优先使用对象组合,而不是继承 类继承:也叫白箱复用 对象组合:也叫黑箱复用. 继承某种程度上破坏了封装性,子父类之间的耦合性过高. 对象组合只要求被组合的对象具 ...

  6. OC 组合实现多继承

    OC无法完全先C++使用多继承,但可以采用组合的模式来代替继承模式.(协议实现)实现多继承的代码:举例现在ClassC需要继承ClassA中methodA.ClassB中methodB,具体的代码为: ...

  7. C++编程进阶6(public继承与组合、private继承、多重继承、处理模板基类内的名称、如何避免模板代码膨胀)

    二十一.public继承与组合 public继承是是子类对象is a基类对象的关系,比如QT中的所有组件类都要继承QObject,所以所有的QT组件都是一个QObject. 而组合是has a(包含) ...

  8. python 类继承和组合_python3--类与继承和组合

    类和继承:"是一个"关系 我们已经深入探索了继承的机制,这里举个例子来说明它是如何用于模拟真实世界的关系的.从程序员的角度来看,继承是由属性点号运算启动的,由此触发实例.类以及任何 ...

  9. [UE4] Component BluePrint 组合 代替 BluePrint 继承 实现 ECS 结构

    ECS 使用组件的组合代替 Actor 的继承,就是出于简化系统复杂度的考虑 我在网上看到的示例是说,系统要遍历他使用到的组件,我想的是,其实也可以是,要交互的时候就访问实体是否有这个组件,有的话这个 ...

最新文章

  1. 在LVM中恢复已删除的物理卷
  2. html万年历闹钟怎么取消,万年历如何取消整点报时,他上面有四个键,分...
  3. # 异运算_小学六年级数学知识点总结-03分数的混合运算
  4. 文件上传api——MultipartFile
  5. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】
  6. SharePoint学习札记[3] — Office SharePoint Server 2007部署
  7. sudo apt-get nmap 报错锁占用
  8. 老年机按键串号_为什么老人机依然很多人在用?
  9. sklearn的快速使用
  10. 由“从按下回车到网页显示”粗谈网页优化
  11. 前端导出Excel兼容写法
  12. 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例8
  13. 青云、金山云亏损IPO,为何中小云厂商“恰饭”这么难?
  14. [吐槽]今天单纯吐槽一下VS2017社区版
  15. cx_Oracle.DatabaseError: DPI-1072: the Oracle Client library version is unsupported 已解决
  16. 英文金曲大赛c语言,英文歌曲_最激情!佐治亚理工开学典礼欢迎辞_沪江英语
  17. js html 编辑器添加图片不显示,彻底解决ewebeditor网站后台不能上传图片的方法
  18. 7.1 Python中文件的读取和写入
  19. TOF相机很好的总结
  20. 自适应的对话气泡皮肤实现方案

热门文章

  1. 1-骨骼 形体 修图技巧
  2. python利用公式计算Π(pi)的值
  3. Linux——Bash Shell脚本 for循环
  4. HTML5 代码实例
  5. JDK版本查看(windows)
  6. 数据库结构比对,再初始数据比对方法
  7. Naxx Central District 1 Ice dragon saffron
  8. laradock一些坑(长期维护)
  9. 码云图床失效解决方案
  10. Flutter 自定义View之 饼状图