← 返回题目列表

审批流和规则引擎适合用责任链模式吗?

高频 中等 第 5 / 27 题 更新于 2026/08/02
责任链模式审批流规则链风控业务建模

简化版

审批流和规则引擎都可以使用责任链思想,但要看业务语义。审批流通常是按层级或条件逐级传递,可能命中后结束,也可能继续升级;规则链通常是多个规则依次判断,可能一票否决、累计得分或收集命中结果。关键是把处理结果、顺序和短路规则定义清楚。

详细版

责任链适合“多个处理节点按顺序处理同一请求”的场景,所以审批流、风控规则链、优惠规则链、异常处理链都常见。但不同业务不能用同一种链路语义硬套。审批流更强调谁有权限审批、是否需要上级继续审批;规则链更强调规则是否启用、命中后是否停止、多个结果如何合并。

如果是请假审批,可以设计为 主管 -> 经理 -> 总监,请假 1 天主管通过即可,请假 5 天要继续到经理或总监。如果是风控规则链,可以设计为 黑名单 -> 设备风险 -> IP 风险 -> 频率风险,其中黑名单可以直接拒绝,其他规则可能累计风险分。

面试时要强调:责任链能表达审批和规则的执行顺序,但复杂 BPMN 流程、并行网关、回退、加签、会签等能力,不应该只靠一个简单责任链硬写。

完整版教学

一、审批流为什么天然像责任链

审批流常见逻辑是“当前审批人能处理就处理,不能处理就交给下一级”。比如请假 1 天主管审批,请假 3 天经理审批,请假 7 天总监审批。这和责任链的“请求沿链传递,某个处理器决定处理或继续”非常接近。

LeaveRequest(days=1) -> TeamLead(handle) -> stop
LeaveRequest(days=3) -> TeamLead(pass) -> Manager(handle) -> stop
LeaveRequest(days=7) -> TeamLead(pass) -> Manager(pass) -> Director(handle)

如果有 1000 个请假请求,其中 700 个是 1 天以内、250 个是 3 天以内、50 个超过 3 天,那么责任链可以让大部分请求在前两个节点结束。它既表达了组织层级,也避免调用方写很多 if days <= 1 else if days <= 3

记忆钩子:审批流用责任链时,核心问题是“当前节点有没有审批权,以及处理后是否还要升级”。

二、审批链要明确处理后是否继续

审批有两种语义:一种是命中即结束,比如主管能批就不再找经理;另一种是逐级确认,比如金额超过 10 万时主管、经理、总监都要签。两种都可以用责任链,但处理器返回结果不同。

审批语义执行方式示例
命中即结束当前节点有权则停止1 天请假主管通过
逐级确认当前节点通过后继续大额采购逐级签字
条件升级当前节点决定是否升级风险高时追加总监
enum ApprovalDecision {
    APPROVED_STOP,
    APPROVED_CONTINUE,
    REJECTED_STOP,
    PASS_TO_NEXT
}

如果不定义清楚,面试官会追问“主管批完后经理还批不批”。这不是代码细节,而是业务语义。责任链只是承载语义,不能替你决定语义。

三、规则链更常见的是多规则组合

规则链和审批链不完全一样。规则链里的每个节点通常是一个规则,比如黑名单规则、设备规则、IP 规则、频率规则。命中规则后可能直接拒绝,也可能累计风险分,还可能只是打标签供后续规则使用。

登录请求 -> 黑名单规则 -> 设备规则 -> IP规则 -> 频率规则 -> 决策

黑名单命中: 直接拒绝
设备异常: +40 分
IP 异常: +30 分
频率异常: +20 分
总分 >= 60: 拒绝

这个例子里,黑名单是短路规则,设备、IP、频率是累加规则。责任链可以统一调度这些规则,但结果合并逻辑要明确。否则某个规则返回 false,到底表示拒绝、未命中、还是继续执行,会非常混乱。

四、规则结果要比布尔值更丰富

审批和规则链都不适合只返回 true/falsetrue 是通过还是命中?false 是拒绝还是跳过?高频工程面试里,面试官常用这个点判断候选人是否有真实落地经验。更稳的是返回结构化结果。

record RuleResult(
    RuleStatus status,
    String code,
    int score,
    boolean stop,
    String reason
) {}
返回字段作用示例
status表达通过、命中、拒绝、错误HIT
code机器可读原因DEVICE_RISK
score用于累计决策40
stop是否短路false
reason人类可读说明新设备登录

五、复杂流程不要硬套简单责任链

责任链适合线性、有序、节点职责清晰的流程。如果审批流包含并行会签、加签、撤回、转办、超时升级、流程回退,就已经接近工作流引擎或 BPMN 模型。此时用一条简单责任链硬写,后期会出现大量特殊判断。

简单线性:
提交 -> 主管 -> 经理 -> 完成

复杂流程:
提交 -> 并行会签(A,B,C) -> 条件网关 -> 加签 -> 回退 -> 超时升级

责任链不是不能参与复杂流程,而是应该退到某个局部。比如工作流引擎决定当前节点,责任链只负责“节点内前置校验”或“提交前规则校验”。这样边界更清楚。

六、审批链和规则链都要支持可配置但要可控

业务经常要求“这个规则临时关闭”“这个部门审批层级不同”“这个金额阈值可配置”。可配置是合理需求,但不能让业务配置直接变成不受控代码。链路配置至少要支持版本、灰度、回滚和审计。

ruleChain version=v12
BlackList(order=100, enabled=true)
DeviceRisk(order=200, enabled=true)
IpRisk(order=300, enabled=false)
FrequencyRisk(order=400, enabled=true)

假设风控规则有 8 条,某业务只启用 5 条,配置变更后要能看到“从 v11 到 v12,关闭了 IpRisk”。如果线上拒绝率从 2% 涨到 6%,就能快速关联到配置版本。

七、面试回答可以用两个例子打透

回答这类题时,不要只说“适合”。可以各举一个审批和规则例子。审批例子强调层级传递和是否继续,规则例子强调短路、累计和结果合并。两个例子能说明你知道责任链有不同变体。

审批链:
Leader(pass/approve/reject) -> Manager -> Director

风控规则链:
BlackList(stop reject) -> Device(+40) -> IP(+30) -> Frequency(+20) -> ScoreDecision

这两个例子还可以自然引出顺序问题:黑名单应该放前面,因为命中后可以快速拒绝;累计规则顺序可能不影响最终分数,但会影响日志、性能和依赖字段。

八、常见误区与追问

  • 误区:审批流都适合用责任链。 线性审批适合,复杂会签、回退、加签更适合工作流引擎或状态机。
  • 误区:规则链返回布尔值就够了。 规则结果需要表达命中、拒绝、分数、原因和是否短路,布尔值会丢语义。
  • 误区:规则顺序不重要。 短路规则、依赖前置字段的规则、昂贵远程规则都受顺序影响。
  • 追问:一票否决和累计评分怎么共存? 用结构化结果,黑名单这类规则设置 stop=true,其他规则累加分数后由最终决策器判断。
  • 追问:审批人动态变化怎么办? 链路节点可以由组织关系和配置生成,但生成后要输出链路快照并记录版本。
  • 追问:责任链和规则引擎有什么区别? 责任链是执行结构,规则引擎还包含规则表达、匹配、冲突解决、版本管理等能力。

九、加强记忆

审批和规则链记住“两问一界限”:第一问当前节点能不能处理,第二问处理后还要不要继续;界限是复杂流程不要硬塞进线性链。审批链重点是权限和升级,规则链重点是短路和结果合并。把这几个词带进答案,面试官基本能听出你不是只背模式定义。