适用于多场景灵活业务规则的动作执行授权设计模式咨询
基于成熟设计模式的灵活规则校验系统实现方案
针对你描述的业务场景——Actor对实体执行Action前需校验一组随业务频繁变化的规则,推荐以下几种落地方案,均基于经典设计模式,无需从零搭建:
1. 核心基础:规则模式(Rule Pattern)+ 策略模式(Strategy Pattern)
这是最轻量化、易维护的组合方案,核心思路是把每个业务规则封装成独立的原子组件,再根据上下文动态选择并执行规则集合。
落地步骤:
- 定义统一规则接口:所有规则实现相同的接口,保证校验逻辑的一致性:
public interface BusinessRule { // 校验方法,传入包含Actor、实体、动作类型等信息的上下文 boolean validate(ActionExecutionContext context); // 返回规则校验失败的错误信息 String getFailureMessage(); }
- 实现独立规则类:每个规则只负责单一校验逻辑,比如:
public class UserPermissionRule implements BusinessRule { @Override public boolean validate(ActionExecutionContext context) { // 校验当前用户是否有执行该Action的权限 return context.getActor().hasPermission(context.getActionType()); } @Override public String getFailureMessage() { return "当前用户无权限执行该操作"; } } public class EntityStatusRule implements BusinessRule { @Override public boolean validate(ActionExecutionContext context) { // 校验实体状态是否允许执行当前Action return context.getEntity().getStatus() == EntityStatus.ENABLED; } @Override public String getFailureMessage() { return "实体状态不允许执行该操作"; } }
- 构建规则引擎执行器:负责加载指定规则集合,批量执行校验并汇总错误:
public class RuleValidator { private List<BusinessRule> activeRules; public RuleValidator(List<BusinessRule> activeRules) { this.activeRules = activeRules; } public void executeValidation(ActionExecutionContext context) throws RuleValidationException { List<String> failureMessages = new ArrayList<>(); for (BusinessRule rule : activeRules) { if (!rule.validate(context)) { failureMessages.add(rule.getFailureMessage()); } } if (!failureMessages.isEmpty()) { throw new RuleValidationException("规则校验失败", failureMessages); } } }
- 配置化规则集合:通过配置文件(如YAML、JSON)定义不同场景下的启用规则,启动时根据配置实例化对应规则类并注入到
RuleValidator:
# 针对用户执行UPDATE_ENTITY动作的规则配置 action_type: UPDATE_ENTITY actor_type: USER active_rules: - "UserPermissionRule" - "EntityStatusRule" - "UserOperationQuotaRule"
2. 进阶优化:注解驱动+配置中心热更新
如果你的系统基于Spring等框架,可以结合注解进一步简化规则的注册和管理:
- 定义
@BusinessRuleConfig注解,标记规则类的适用场景(如动作类型、Actor类型) - 实现规则注册表,自动扫描所有带注解的规则类并缓存
- 对接配置中心(如Nacos、Apollo),实时拉取最新的规则配置,动态重建
RuleValidator实例,实现规则热更新无需重启服务
3. 复杂场景:成熟规则引擎(如Drools)
如果业务规则极其复杂(包含大量分支、条件组合),且变化频率极高,可以直接采用成熟的规则引擎。这类引擎支持用DSL(领域特定语言)编写规则,无需修改代码即可更新规则,同时提供规则优先级、冲突解决等高级特性。但注意:规则引擎有一定学习成本,若业务规则复杂度不高,前两种方案足够满足需求。
关键注意事项
- 上下文设计要可扩展:
ActionExecutionContext需包含所有规则可能用到的信息(Actor属性、实体数据、动作元信息、时间、环境变量等),避免后续因新增规则频繁修改上下文类 - 规则保持原子性:每个规则只负责单一校验逻辑,不要混合多个校验场景,方便独立修改和测试
- 错误信息标准化:规则返回的错误信息需清晰明确,便于前端展示和问题排查
内容的提问来源于stack exchange,提问作者Ignacio Negro Caino
相关产品推荐
相关产品推荐

