本文主要是介绍多用组合少用继承,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
面向对象编程时,有十条很重要的原则:
- 代码复用
- 封装变化
- 开闭原则
- 单一职责原则
- 依赖注入/依赖倒置原则
- 里氏替换原则(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
这篇关于多用组合少用继承的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!