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

策略设计模式降低代码圈复杂度的适用性及消除条件语句的疑问

关于策略模式的两个问题解答

1. 策略设计模式为何适用于降低代码的圈复杂度?

圈复杂度的核心计算依据是代码中的分支点数量(if/switch、循环等),分支越多,圈复杂度越高,代码越难维护和测试。

策略模式通过以下方式降低圈复杂度:

  • 移除核心类的分支逻辑:把原本写在Context类里的条件分支判断(比如根据不同场景执行不同行为的if/switch),拆分成独立的Strategy实现类。Context类不再需要判断该用哪种行为,只需要依赖抽象的Strategy接口调用统一方法即可,这直接砍掉了Context类里的所有分支点。
  • 单一职责拆分:每个Strategy类只实现一种具体行为,逻辑单一,自身的圈复杂度极低,不会出现多个分支嵌套的情况。
  • 避免分支扩散:后续新增行为时,只需要新增一个Strategy实现类,不需要在原有代码里加新的else/switch case,不会导致圈复杂度随着功能迭代持续上升。

举个简单例子:
原来的Context代码(圈复杂度3):

public class PaymentContext {
    public void pay(String type) {
        if (type.equals("alipay")) {
            // 支付宝支付逻辑
        } else if (type.equals("wechat")) {
            // 微信支付逻辑
        }
    }
}

用策略模式重构后,Context的圈复杂度变为1:

public class PaymentContext {
    private PaymentStrategy strategy;
    public PaymentContext(PaymentStrategy strategy) {
        this.strategy = strategy;
    }
    public void pay() {
        strategy.pay();
    }
}

public interface PaymentStrategy {
    void pay();
}

public class AliPayStrategy implements PaymentStrategy {
    public void pay() {
        // 支付宝支付逻辑
    }
}

public class WeChatPayStrategy implements PaymentStrategy {
    public void pay() {
        // 微信支付逻辑
    }
}

2. 上述多客户端场景是否就是该模式“消除条件语句”表述所指,还是我有所遗漏?

GoF提到的“消除条件语句”,核心是消除承载核心业务逻辑的Context类中的条件语句,而不是要求整个代码库完全没有任何条件分支。

你提到的多客户端场景是符合这个表述的一种情况,但不是唯一情况:

  • 当存在多个客户端时,每个客户端直接创建对应的Strategy和Context组合,确实不需要任何条件分支,这是最理想的无分支场景。
  • 但更多时候,单一客户端也可以通过其他方式避免条件分支的“转移”:比如用依赖注入框架自动注入所需的Strategy,或者把策略选择逻辑封装到专门的策略工厂类中,让业务代码(客户端)不需要处理分支判断。

GoF的表述重点是:把原本混杂在核心业务逻辑里的条件分支,从Context类中剥离出去——不管是转移到客户端、工厂类,还是通过DI框架处理,只要核心业务类(Context)不再有分支,就达成了“消除条件语句”的核心目的。你理解的多客户端场景是其中一种,但不要局限于此,核心是让核心业务类摆脱分支逻辑的困扰。

内容的提问来源于stack exchange,提问作者Niek Beijloos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:55:22