抽象类建模核心是“层级即责任”,需按业务归属定义继承链,顶层封装共性,中间层增加维度属性并设扩展点,具体类专注领域行为;模板方法固化流程主干,子类仅实现可变环节;通过protected控制可见性,禁止public字段,构造逻辑集中于父类;分层须满足共享状态/行为且确需复用,否则应改用接口或工具类。

抽象类在复杂业务系统中划分层级,核心不是堆砌继承层数,而是围绕业务语义建模,让每一层都承担明确、不可替代的职责。关键在于“层级即责任”,而不是“继承即分层”。
按业务归属关系定义继承链
组织架构、产品分类、审批流程这类天然存在上下级关系的业务模型,最适合用抽象类逐层建模。
- 顶层抽象类(如 BusinessEntity)封装所有实体共性:唯一编码、创建时间、状态字段、基础校验逻辑
- 中间层(如 OperationalUnit)继承顶层,增加运营维度属性:负责人、预算池、下属单位列表,并定义 protected abstract void onBudgetApproved() 作为扩展点
- 具体业务类(如 RegionalSalesTeam 或 CloudProductLine)继承中间层,只实现本领域专属行为,比如销售团队重写业绩统计逻辑,产品线重写定价策略
用模板方法固化主干流程
当多个业务模块共享相同执行步骤但细节不同,就把流程骨架放在抽象父类,把可变环节声明为 protected abstract 方法。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 例如审批流程:final void executeApproval() 统一调用 validate() → notifyStakeholders() → persistDecision() → sendResult()
- 子类只需实现 protected abstract boolean isFinalApprover(User user) 和 protected abstract String getAuditTrailMessage()
- 流程顺序、异常处理、日志埋点全部由父类控制,避免子类自行拼接导致逻辑散乱
通过访问修饰符控制层级可见性
层级之间不是越透明越好,而是按业务权限设计数据与行为的暴露边界。
立即学习“Java免费学习笔记(深入)”;
- 关键状态字段(如 approvalStatus、version)声明为 protected,允许子类直接读取或安全更新
- 禁止 public 字段——防止下游随意修改破坏父类不变量
- 构造逻辑集中在抽象父类:统一初始化审计字段、生成唯一ID、设置默认状态,子类通过 super(...) 传递必要参数,不重复写初始化代码
避免过度分层和伪抽象
不是每多一层继承就更“优雅”,抽象类层级应满足两个硬性条件:有共享状态/行为,且下层确实需要复用上层逻辑。
- 如果某层只定义了几个常量或空方法,没有实质复用价值,它大概率不该是抽象类——考虑用接口或工具类替代
- 两层之间没有明显职责分离(比如 SalesOrder 直接继承 BusinessEntity 就足够,中间加个 OrderBase 却没新增任何共性),说明分层冗余
- 当某个子类频繁重写父类的非抽象方法来“绕过”逻辑,说明父类封装错了粒度,该拆不该继承

















