在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
java中用组合代替继承的核心是将重复但非本质的行为(如日志、校验、支付、通知)抽为接口统一的小组件,通过构造注入组装,实现可插拔、可替换、可复用及运行时灵活混搭。

Java 中用组合代替继承,核心不是“删掉 extends”,而是把原本靠父子层级硬绑定的功能,拆成可插拔、可替换、可复用的独立组件,再按需装配。它真正解决的,是继承树越长越脆、一改全崩、新增类型要复制粘贴的问题。
识别哪些功能该抽出来组合
先看现有继承链里反复出现、但又不定义类本质的行为,比如:
- 日志记录(ConsoleLogger / FileLogger)
- 参数校验(EmailValidator / LengthValidator)
- 支付处理(AlipayStrategy / WechatStrategy)
- 通知发送(EmailNotifier / SmsNotifier)
这些不是“订单”或“用户”本身,而是它们“拥有的能力”。把它们封装成小而专的类,各自实现统一接口(如 Logger、Validator),就完成了第一步解耦。
用构造注入组装能力,而非 extends 继承
原来写 class OrderService extends BaseService,现在改成:
public class OrderService {<br> private final Logger logger;<br> private final Validator validator;<br> private final PaymentProcessor processor;<br><br> public OrderService(Logger logger, Validator validator, PaymentProcessor processor) {<br> this.logger = logger;<br> this.validator = validator;<br> this.processor = processor;<br> }<br>}
关键点:
- 依赖用接口声明,不用具体实现类
- 构造函数强制传入,避免空指针
- 测试时直接塞 Mock 对象,上线换实现,主逻辑零改动
支持多维度混搭与运行时切换
当业务需要灵活组合时,组合天然比继承更合适。例如:
- 一个站点既要租自行车,又要租皮划艇 → 不用新建 BikeAndCanoeStation 类,只需在类中同时持有 BikeService 和 CanoeService
- 下单时根据国家自动选支付方式 → 用工厂返回对应 PaymentStrategy 实例,注入到 OrderService 中
- 需要同时发邮件和短信 → 用 CompositeNotifier 聚合多个 notifier,自身只实现统一的
notify()接口
这种嵌套和策略切换,在继承体系里只能靠不断加子类,组合则在运行时就能完成。
注意生命周期与边界,别让组合变混乱
组合不是随便 new 一堆对象塞进去。要分清:
- 组合(Composition):生命周期一致,如订单包含订单项 → 在构造函数中创建
- 聚合(Aggregation):生命周期独立,如用户引用邮箱服务 → 由 Spring 容器注入或工厂获取
- 避免 A 持有 B,B 又持有 A 的循环引用
- DB 连接、HTTP 客户端等资源型对象,一律交给 DI 容器管理,业务类不自己 new
这样既保持灵活性,又不会因随意组合导致内存泄漏或初始化失败。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










