多用组合少用继承 悠悠 2022-12-10 03:54 62阅读 0赞 面向对象编程时,有十条很重要的原则: * 代码复用 * 封装变化 * 开闭原则 * 单一职责原则 * 依赖注入/依赖倒置原则 * 里氏替换原则(LSP) * 接口隔离原则(ISP) * 多用组合,少用继承 * 面向接口编程 * 委托原则 ![20160918143640220][] 上图摘自《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][] [20160918143640220]: /images/20221123/011fc9cec4874a6eac4fc88334dcefe4.png [5 Reasons to Use Composition over Inheritance in Java and OOP]: http://javarevisited.blogspot.hk/2013/06/why-favor-composition-over-inheritance-java-oops-design.html [10 Object Oriented Design Principles Java Programmer should know]: http://javarevisited.blogspot.hk/2012/03/10-object-oriented-design-principles.html
还没有评论,来说两句吧...