Java中组合与继承该如何选择_对象复用策略解析

老墨君_8378

老墨君_8378

2026-01-07

297人浏览

原创

组合优于继承,关键在于判断是否为真正的“is-a”关系;若仅为代码复用或职责不同,应选组合以降低耦合、提升可测性与可扩展性;仅当满足里氏替换且存在共享行为时才用继承。

java中组合与继承该如何选择_对象复用策略解析

组合优于继承,这是Java设计中被广泛接受的原则。选择的关键不在于“能不能用继承”,而在于“这个关系是不是真正的‘is-a’”。如果只是想复用代码,组合更灵活、低耦合、易测试;只有当子类在逻辑上确实是父类的一种时,继承才合适。

看语义:先问“它是不是一种?”

继承表达的是类型之间的层级关系,必须满足里氏替换原则——任何使用父类的地方,都能无缝替换为子类。比如"Dog is a Animal"成立,适合继承;但"Car has an Engine"不是“是一种”,而是“拥有一个”,这时该用组合。

  • 如果把“ReportGenerator”继承“FileWriter”,就混淆了职责——它不是一种文件写入器,只是需要写文件
  • 若强行用继承,后续想换输出方式(如写到数据库或发HTTP请求)就得改继承结构,破坏开闭原则
  • 用组合的话,只需注入不同的Writer实现,行为可插拔,结构稳定

看变化:哪个部分更可能变?

继承让子类与父类紧绑定,父类一改,所有子类都可能受影响;组合则把变化封装在独立对象里,修改内部实现不影响外部接口。

Crypto Whale Intelligence
Crypto Whale Intelligence

用于加密鲸情报的自动化技能

下载
  • 比如“订单服务”需要计算运费,用继承意味着把计费逻辑写进基类——一旦促销规则、地区策略、物流渠道频繁调整,基类会越来越臃肿
  • 改用组合:定义ShippingCalculator接口,不同实现(FlatRate、WeightBased、FreeForVIP)可自由切换,测试也只需mock接口
  • 运行时甚至能根据订单属性动态选择策略,继承做不到这点

看测试与维护:谁更容易单元测试?

继承结构下,子类测试常需启动整个继承链,依赖父类状态和构造逻辑,容易出现“测试即集成”的问题;组合天然支持依赖注入,便于隔离测试。

  • 一个继承自JFrame的GUI类,单元测试时会尝试创建真实窗口,失败率高且慢
  • 若改为组合:把业务逻辑抽成独立Service类,GUI只负责展示和转发事件,Service可纯内存测试
  • Mock掉数据库、网络等外部依赖后,核心逻辑验证清晰、快速、可靠

特殊情况:继承仍不可替代

并非完全弃用继承。以下场景中,继承仍有其价值:

  • 需要多态分发且共享大量通用实现,如AWT/Swing组件体系(Button、Label都继承Component,复用事件处理、布局、绘制等基础能力)
  • 框架要求扩展特定抽象类(如Spring的InitializingBean、Hibernate的UserType),此时继承是契约的一部分
  • 构建领域模型中的明确分类层次,如PaymentMethod → CreditCard、PayPal、CryptoWallet,且各子类确实共享核心行为和约束

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java 代码复用 crypto

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2791

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

497

25

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

302

5

Hibernate框架介绍
Hibernate框架介绍

本专题整合了hibernate框架相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.06

3013

15

Java Hibernate框架
Java Hibernate框架

本专题聚焦 Java 主流 ORM 框架 Hibernate 的学习与应用,系统讲解对象关系映射、实体类与表映射、HQL 查询、事务管理、缓存机制与性能优化。通过电商平台、企业管理系统和博客项目等实战案例,帮助学员掌握 Hibernate 在持久层开发中的核心技能。

2025.09.02

8120

14

Hibernate框架搭建
Hibernate框架搭建

本专题整合了Hibernate框架用法,阅读专题下面的文章了解更多详细内容。

2025.10.14

858

8

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

375

14

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

375

14

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

375

14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习