组合替代继承的核心是将“它是什么”转为“它有什么”,通过字段持有可替换的能力模块,使类专注自身职责;能力模块如日志、校验、重试等被抽为小而专的接口实现,构造注入依赖接口,支持运行时策略切换与嵌套,明确生命周期避免循环引用。

直接用组合替代深层继承,核心是把“它是什么”变成“它有什么”,不靠 extends 拉长链,而是靠字段持有能力模块。重点不在删掉 class,而在让每个类只专注自身职责,其他功能交由独立、可替换的组件完成。
识别并拆出可复用的能力模块
先看现有继承链里哪些行为被多个类共用,且与具体类型无关——比如日志、校验、重试、通知、序列化。这些不是“身份”,而是“能力”。把它们一个个抽成小而专的对象:
- 定义 Logger 接口,实现
ConsoleLogger、FileLogger; - 定义 Validator 接口,实现
EmailValidator、LengthValidator; - 把重试逻辑封装为独立的 RetryPolicy 类,不耦合网络或业务细节。
每个模块只做一件事,接口最小化,避免“全能工具类”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用构造注入代替 extends,依赖接口而非实现
原来写 class OrderProcessor extends BaseService,现在改为:
- 声明私有字段:
private logger: Logger;、private validator: Validator;; - 通过构造函数传入实例,类型用接口(如
Logger),不用具体类(如FileLogger); - 可选能力用
Optional<notifier></notifier>或可空类型包装,不强制初始化; - 测试时直接传 mock 对象,上线换实现,主逻辑零改动。
支持运行时嵌套与策略切换
组合天然支持动态组装,不像继承在编译期就锁死:
- 一个
OrderProcessor可同时持有PaymentStrategy、NotificationStrategy、CacheStrategy; - 下单时按用户地区选支付方式:
strategyFactory.getStrategy(country); - 需要发多渠道通知?用
CompositeNotifier聚合EmailNotifier和SmsNotifier,自身不继承任何 notifier; - 嵌套层级控制在两到三层,若出现 A→B→C→D 长委托链,考虑合并相邻组件或引入事件总线解耦。
明确生命周期与所有权,避免循环引用
组合不是随便 new 一堆对象塞进去,得理清谁创建、谁销毁:
- 组合(Composition):生命周期一致,如订单包含订单项 → 在构造函数中创建;
- 聚合(Aggregation):生命周期独立,如用户持有邮箱服务 → 由 DI 容器或工厂注入;
- 严禁 A 持有 B、B 又持有 A,否则初始化失败或内存泄漏;
- DB 连接、HTTP 客户端等资源型对象,统一交给 DI 容器管理,业务类不自行 new。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










