如何使用设计模式优化返回枚举的多层if判断并拆分if内判定条件
规则拆分解耦方案
这个场景用责任链模式(Chain of Responsibility) 适配度最高,刚好匹配你按优先级顺序匹配规则、匹配成功直接返回结果的逻辑,还能完全把不同判定逻辑拆分到独立类中,后续新增规则不需要修改原有核心判定逻辑。
实现步骤
1. 抽象通用规则接口
先定义统一的规则规范,每个独立规则只需要实现「是否匹配当前场景」、「匹配后返回对应结果」两个能力即可:
// 通用规则接口,也可以用抽象类根据需求加公共逻辑 public interface GameJudgeRule { boolean isMatch(Game game); Result getResult(); }
2. 每个判定条件单独实现规则类
把你现有代码里的每一个if分支,都拆成独立的规则实现类,每个类只负责自己的判定逻辑:
// 积分平局规则 public class TieByPointsRule implements GameJudgeRule { @Override public boolean isMatch(Game game) { // 原有TieByPoints()的逻辑直接迁移到这里即可 return game.getPlayerPoints().values().stream().distinct().count() == 1; } @Override public Result getResult() { return Result.TieByPoints; } }
同理依次实现TieByTimeOverRule、JustOnePlayerWinRule、ManyPlayersWinRule等所有规则类,每个类的逻辑完全独立,互不影响。
3. 构造有序规则链执行判定
在Game类中维护一个按判定优先级排序的规则列表,执行判定时按顺序遍历规则,找到第一个匹配的规则就直接返回对应结果:
public class Game { // 按判定优先级排序的规则列表,后续新增规则只需要往列表对应位置加实例即可 private final List<GameJudgeRule> judgeRules = List.of( new TieByPointsRule(), new TieByTimeOverRule(), new JustOnePlayerWinRule(), new ManyPlayersWinRule() ); public Result judge() { for (GameJudgeRule rule : judgeRules) { if (rule.isMatch(this)) { return rule.getResult(); } } // 兜底逻辑,所有规则都不匹配时返回默认值 return Result.Undecided; } // 游戏类原有其他属性、方法保留即可 }
方案优势
- 完全符合开闭原则:后续新增判定规则不需要修改原有
judge()方法的核心逻辑,只需要新增规则实现类,插入到规则列表对应优先级位置即可 - 逻辑彻底解耦:每个规则的判定逻辑、对应返回值都独立维护,不会出现几百行if堆叠的情况,排查问题只需要定位对应规则类即可
- 优先级灵活调整:只需要调整规则列表的元素顺序,就能修改判定的优先级,不需要修改逻辑代码
如果规则数量非常多,还可以配合SPI机制自动扫描加载所有规则类,连规则列表的硬编码都可以省掉,进一步降低维护成本。
内容的提问来源于stack exchange,提问作者Polaks
相关产品推荐
相关产品推荐

