惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
GbyAI
GbyAI
aimingoo的专栏
aimingoo的专栏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
腾讯CDC
博客园 - Franky
Engineering at Meta
Engineering at Meta
C
Check Point Blog
T
The Blog of Author Tim Ferriss
有赞技术团队
有赞技术团队
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
I
InfoQ
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
Last Week in AI
Last Week in AI
S
SegmentFault 最新的问题
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学

灯火不休时

给国行iPhone用户看的WWDC26 重复造轮子之简易RPC框架 Spring AOP 动态代理机制:从静态代理到 JDK 与 CGLIB 的实现 从零手写一个 Spring Boot Starter:深入理解自动装配原理 LangChain4j工具调用中断引发JSON格式报错的问题调查 基于CNN深度学习网络的交通标志识别 NPM包管理工具的幻影依赖问题 CSS多行溢出,兼容性比较好的做法 Hadoop集群搭建(1主2从) 利用PyCharm简化搭建深度学习环境(新手排坑) Win10简洁之道 栈与队列的应用 顺序表的增删改查
策略模式优化多重判断
灯火不休时 · 2025-10-16 · via 灯火不休时

使用策略模式优化多重if-else条件判断。针对b值为空、"0"、"1"时对字符串a的不同匹配规则,通过定义策略接口、实现具体策略类、创建策略工厂,将条件逻辑解耦,使代码结构清晰、易于维护和扩展,有效解决传统多层嵌套判断导致的代码臃肿问题,提升代码质量和可读性。

策略模式( Strategy ),通常可以被用来优化多重嵌套的条件判断逻辑中,解耦代码。

多条件判断

假设有如下需求,给两个字符串a,b,经过一些处理,返回b的值,其中b的值有如下要求:

  1. b为空 且a中包含0、1、2、3、4中任意一个,则b的值即为所包含的这个值,如果不包含,则返回空字符串
  2. b为0 且a中包含1、2、3、4中任意一个,则b的值即为所包含的这个值,如果不包含,则返回空字符串
  3. b为1 且a中包含2、3、4中任意一个,则b的值即为所包含的这个值,如果不包含,则返回空字符串

如果按照这个规则,直接写代码的话可能会是如下写法

GetString.javajava
public static String getString(String a, String b) {
    if ("".equals(b)) {
        if (a.contains("0")) {
            b = "0";
        } else if (a.contains("1")) {
            b = "1";
        } else if (a.contains("2")) {
            b = "2";
        } else if (a.contains("3")) {
            b = "3";
        } else if (a.contains(" 4 ")) {
            b = "4";
        } else {
            b = "";
        }
    } else if ("0".equals(b)) {
        if (a.contains("1")) {
            b = "1";
        } else if (a.contains("2")) {
            b = "2";
        } else if (a.contains("3")) {
            b = "3";
        } else if (a.contains("4")) {
            b = "4";
        } else {
            b = "";
        }
    } else if ("1".equals(b)) {
        if (a.contains("2")) {
            b = "2";
        } else if (a.contains("3")) {
            b = "3";
        } else if (a.contains("4")) {
            b = "4";
        } else {
            b = "";
        }
    }
    return b;
}

可以看到如果全部是顺序逻辑编写的话,会嵌套很多层的if-else,不利于后期维护时增加其他逻辑或者修改逻辑等,这时候就可以考虑使用策略模式来优化多层if-else的判断。

策略模式优化步骤

构造策略接口

通过上面的要求,可以了解到最外层是3次判断b的值,所以我们可以简单分类为3种策略,首先抽象出这3种策略的通用接口接口,然后再分3中实现方式实现这个接口

GetStringStrategy.javajava
/**
 * 获取字符串策略接口
 */
public interface GetStringStrategy {
    String getStringStrategy(String a);
}

实现策略接口

编写策略接口的实现类,这里就是内层的判断,把内层的判断逻辑摘出来,改为3个策略接口的实现类

GetStringStrategyAImpl.javajava
import demo.GetStringStrategy;

/**
 * b为空的实现类
 * @author dhbxs
 * @since 2025/9/12 9:19
 */
public class GetStringStrategyAImpl implements GetStringStrategy {

    @Override
    public String getStringStrategy(String a) {
        for (char ch : "01234".toCharArray()) {
            if (a.contains(String.valueOf(ch))) {
                return String.valueOf(ch);
            }
        }
        return "";
    }
}
GetStringStrategyBImpl.javajava
import demo.GetStringStrategy;

/**
 * b为0的实现类
 * @author dhbxs
 * @since 2025/9/12 9:22
 */
public class GetStringStrategyBImpl implements GetStringStrategy {
    @Override
    public String getStringStrategy(String a) {
        for (char ch : "1234".toCharArray()) {
            if (a.contains(String.valueOf(ch))) {
                return String.valueOf(ch);
            }
        }
        return "";
    }
}
GetStringStrategyCImpl.javajava
import demo.GetStringStrategy;

/**
 * b为1的实现类
 * @author dhbxs
 * @since 2025/9/12 9:22
 */
public class GetStringStrategyCImpl implements GetStringStrategy {
    @Override
    public String getStringStrategy(String a) {
        for (char ch : "234".toCharArray()) {
            if (a.contains(String.valueOf(ch))) {
                return String.valueOf(ch);
            }
        }
        return "";
    }
}

工厂类创建策略

有了策略接口,也有了3种策略对应的实现类,现在需要由统一的一个工厂类帮助我们创建这3种实现类的实体对象,隐藏具体调用的实现类,对外只暴露该工厂类,方便调用

GetStringStrategyFactory.javajava
package demo;

import demo.impl.GetStringStrategyAImpl;
import demo.impl.GetStringStrategyBImpl;
import demo.impl.GetStringStrategyCImpl;

import java.util.HashMap;
import java.util.Map;

/**
 * 创建策略工厂类
 *
 * @author dhbxs
 * @since 2025/9/12 9:24
 */
public class GetStringStrategyFactory {

    // 策略Map, Key 为策略类型, Value 为 策略具体实现类的接口 GetStringStrategy
    private static final Map<String, GetStringStrategy> strategis = new HashMap<>();

    // 提前创建好策略类,缓存到 Map 中
    static {
        strategis.put("", new GetStringStrategyAImpl());
        strategis.put("0", new GetStringStrategyBImpl());
        strategis.put("1", new GetStringStrategyCImpl());
    }

    /**
     * 传入判断条件,获取业务中需要使用的具体策略实现类
     *
     * @param condition 判断条件
     * @return 策略实现类
     */
    public static GetStringStrategy getStringStrategy(String condition) {
        if (condition == null) {
            throw new IllegalArgumentException("condition shoud not be null");
        }

        return strategis.get(condition);
    }
}

调用策略

有了工厂类后,调用方就不需要关心具体调用哪个实现类,只需要调用工厂方法就行,从而达到优化解耦合多重复杂 if-else 嵌套的判断逻辑

GetStringByStrategy.javajava
/**
 * 类似这种根据某一个值类型的不同,去执行不同的代码逻辑时,可以使用策略模式来优化
 *
 * @param a 内层条件a
 * @param b 外层条件b
 * @return b的值
 */
public static String getStringByStrategy(String a, String b) {
    GetStringStrategy stringStrategy = GetStringStrategyFactory.getStringStrategy(b);
    if (stringStrategy != null) {
        return stringStrategy.getStringStrategy(a);
    }
    return b;
}

public static void main(String[] args) {
    String a = "4";
    String b = "2";
    System.out.println(getStringByStrategy(a, b));
}

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:

https://cloud.tencent.com/developer/support-plan?invitecode=1uukf1hgh3yq0