抽象类通过组合解耦变化点,仅定义稳定流程与结构,依赖外部对象实现可变逻辑;字段持有、构造注入、方法委托替代继承;do封装状态,抽象类协调流程;钩子方法支持运行时能力插拔。

在抽象类中通过组合与抽象剥离通用领域模型,核心是让抽象类只管“结构和流程”,把可变、可替换、平台相关或策略相关的部分交给外部对象来承担——不是靠继承塞进子类,而是靠字段持有、构造注入、方法委托来解耦。
用组合替代继承承载变化点
抽象类不继承具体实现,而是声明一个接口类型字段,比如 protected final PaymentProcessor processor 或 private final AuditLogger logger。这些对象由子类或上层容器传入,抽象类只调用它们的方法,不关心内部怎么实现。
- 避免写
extends AlipayPayment或extends RedisCache这类紧耦合继承 - 构造函数强制接收依赖,如
protected OrderBase(PaymentProcessor p, EventPublisher e) - 所有业务操作中涉及支付、日志、事件等,统一走
processor.execute()、logger.log()调用
抽象类定义稳定骨架,留出语义化钩子
抽象类封装不变的生命周期与校验逻辑(如ID生成、状态流转约束、版本检查),同时暴露少量抽象方法,名称必须是具体领域动词+名词,而非泛化接口。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 保留
public final void confirm() { validateBeforeConfirm(); doConfirm(); emitConfirmedEvent(); } - 把真正差异的部分设为
protected abstract void doConfirm();和protected abstract OrderConfirmedEvent emitConfirmedEvent(); - 禁止出现
public abstract void handle(Request r)这类需子类再分支判断的签名
字段与行为分离:DO 只存状态,抽象类协调流程
抽象类本身不直接映射数据库,也不加 @Entity;它持有一个 DO 实例(如 protected final OrderDO data),所有状态读写都通过该 DO 的受控 getter/setter 完成,自身不暴露字段。
- DO 负责字段定义、JPA 注解、基础校验(如
setStatus()检查状态合法性) - 抽象类负责调用
data.setStatus()、组装参数、触发校验器、协调多个 DO 间关系 - 新增业务规则时,改 BO 层逻辑或注入新策略,不动 DO 结构
运行时可插拔,支持按场景叠加能力
抽象类提供 protected 钩子方法(如 protected void beforeSubmit() {}),默认空实现,子类可选择性增强;关键能力(审计、缓存、幂等)通过组合的组件自动生效,无需每个子类重复写。
- 例如提交订单前自动记录操作日志:抽象类在
submit()中调用auditLogger.log(this.data) - 子类不用重写日志逻辑,只需确保构造时传入了正确的
AuditLogger实现 - 测试时可传入
NoOpAuditLogger,生产环境换DbAuditLogger,零侵入切换
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










