抽象类与组合模式结合使用,核心是用抽象类定义统一行为契约和共享能力,再通过组合模式组织树形结构,使叶子节点和容器节点复用抽象逻辑并保持调用一致。

抽象类与组合模式结合使用,核心在于用抽象类定义统一行为契约和共享能力,再通过组合模式组织树形结构,让叶子节点和容器节点都能复用抽象逻辑,同时保持调用一致。
抽象类作为统一组件基类
定义一个抽象组件类(如 AbstractRule),声明所有节点共有的业务方法(如 execute()、validate()),并封装通用能力:日志记录、上下文注入、异常包装、执行耗时统计等。子类无需重复实现这些基础逻辑,只需专注自身业务。
- 强制规范接口:所有规则必须实现
execute(),确保调用入口统一 - 避免重复代码:DAO、配置读取、权限校验等放在抽象类中一次编写,多处受益
- 天然支持 Spring:加
@Component后可被自动扫描,便于后续策略动态装配
叶子节点继承抽象类实现具体逻辑
原子规则(如 AmountThresholdRule、TimeWindowRule)直接继承抽象类,只覆盖核心方法。它们不管理子节点,也不提供 add()、remove() 等容器操作——这是“安全式”设计,避免误调用引发运行时异常。
- 每个叶子类职责单一,专注一个判断条件或执行动作
- 测试成本低:可独立单元测试,不依赖其他规则
- 新增规则只需新增类,不修改已有代码
组合节点同样继承抽象类并持有子组件
容器类(如 AndCompositeRule、OrCompositeRule)也继承同一抽象类,内部维护 List<AbstractRule> 子列表。它重写 execute() 方法,遍历执行所有子规则,并按逻辑聚合结果(如全通过才返回 true)。
立即学习“Java免费学习笔记(深入)”;
- 客户端调用方式完全一致:
rule.execute()既适用于单条规则,也适用于规则组 - 支持嵌套:一个
AndCompositeRule的子节点可以是叶子,也可以是另一个OrCompositeRule - 动态增删:运行时可添加/移除子规则,适合配置化场景(如后台规则引擎)
配合策略模式实现运行时路由
当系统需根据请求类型选择不同规则树时,可引入策略接口(如 RuleStrategy)。每个策略实现类(OrderRuleStrategy、RefundRuleStrategy)返回对应的根组合节点实例。抽象类 + 组合 + 策略三者协同,横向扩展新业务线,纵向细化规则粒度,调用链路保持稳定。
- 策略决定“用哪棵树”,组合负责“怎么执行这棵树”,抽象类保障“每棵树长得一样”
- 规则变更不影响外部调用方,只需替换策略 Bean 或更新配置
- 灰度发布友好:可为某类请求启用新规则树,其余保持旧逻辑


















