You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用设计模式优化返回枚举的多层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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:48:04