责任链模式+策略模式在项目中的实践
1. 责任链模式实现分析
核心组件
-
IProcessRule
接口- 定义责任链节点行为:
filter
(过滤逻辑)和next
(获取下一节点)。 - 符合责任链的“处理-传递”模式。
- 定义责任链节点行为:
-
AbstractProcessRule
抽象类- 实现公共逻辑:处理链式调用(若当前规则过滤后仍有多个候选,继续调用下一个规则)。
- 子类只需实现
doFilter
方法,聚焦具体规则逻辑,符合 模板方法模式。
-
具体规则类(如
DistanceRule
)- 继承
AbstractProcessRule
,实现doFilter
方法,例如按距离排序。
- 继承
责任链执行流程
// 示例:构建责任链
IProcessRule chain = new DistanceRule(new ScoreRule(new CapacityRule(null)));
// 执行过滤
List<ServeProviderDTO> candidates = chain.filter(providers);
- 调用
DistanceRule.doFilter()
按距离排序。 - 若结果数量 >1,调用
ScoreRule.doFilter()
按评分排序。 - 若仍 >1,调用
CapacityRule.doFilter()
按接单能力排序。 - 最终返回唯一候选或最终列表。
2. 策略模式与责任链的结合
策略模式的角色
- 策略接口:定义派单策略的入口方法(如
DispatchStrategy#dispatch
)。 - 具体策略类:每个策略对应一组责任链规则。例如:
public class PriorityDistanceStrategy implements DispatchStrategy { private IProcessRule ruleChain; public PriorityDistanceStrategy() { // 策略1的规则链:距离 → 评分 ruleChain = new DistanceRule(new ScoreRule(null)); } @Override public ServeProviderDTO dispatch(List<ServeProviderDTO> providers) { List<ServeProviderDTO> result = ruleChain.filter(providers); return CollUtils.isEmpty(result) ? null : result.get(0); } }
扩展性优势
- 新增策略:创建新类(如
CapacityFirstStrategy
)并定义其规则链。 - 新增规则:继承
AbstractProcessRule
实现新逻辑,无需修改已有代码。