当前位置: 首页 > news >正文

策略模式优化多重判断

本文首发于个人博客:https://blog.dhbxs.top/archives/P7WqPho9 并长期在个人博客更新。

策略模式( 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的值即为所包含的这个值,如果不包含,则返回空字符串

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

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中实现方式实现这个接口

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

实现策略接口

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

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

工厂类创建策略

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

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 为 策略具体实现类的接口 GetStringStrategyprivate 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 嵌套的判断逻辑

/*** 类似这种根据某一个值类型的不同,去执行不同的代码逻辑时,可以使用策略模式来优化** @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));
}
http://www.dtcms.com/a/507311.html

相关文章:

  • ios云打包证书申请不需要苹果电脑也是可以的
  • UniApp USB存储设备U盘操作、读写原生插件
  • 邢台 建网站中国机械设备制造网
  • app网站开发河 又最新新闻热点事件300字
  • ZooKeeper集群:分布式系统的核心守护者
  • 网鼎杯 2020 朱雀组
  • 开发避坑指南(63):解决SQL排序子句列名歧义异常:Column ‘xxx‘ is ambiguous
  • 【C + +】红黑树:全面剖析与深度学习
  • 数据结构(顺序表和链表)
  • C# 基础——装箱和拆箱
  • 分享网站友情链接营销
  • windows中用wsl使用cuda
  • 运维逆袭志·第3期 | 数据孤岛破局之战 :跨业务分析的难题攻坚
  • 《道德经》第二十一章
  • 第 14 章:Spring AI Alibaba — Nacos3实现动态Prompt
  • TableTime:将时序分类重构为表格理解任务,更有效对齐LLM语义空间
  • Java的main方法语法
  • 【Linux】 层层递进,抽丝剥茧:调度队列、命令行参数、环境变量
  • 火电厂VR安全培训系统怎么样?VR安全培训告别传统培训痛点!
  • 网站建设有哪些工作儿童教育网站源码
  • 开题报告之基于SpringBoot框架的路面故障信息上报系统设计与实现
  • rabbitmq服务端消费端实例(direct和fanout模式)
  • 橙色车队上的安全密码:嘉顺达蓝海的危险品运输专业之道
  • FPGA高频面试问题整理—附答案
  • html框架做网站创立个网站专业卖手机
  • 【设计模式】单例模式(Singleton)
  • 2025.10.18 TRAE HACKATHON WUHAN 黑客马拉松在武汉隆重举行[特殊字符]
  • php5 mysql网站开发实例精讲东莞保安公司联系电话
  • 怎么加入网站做微商城深圳广告设计与制作公司
  • App 上架 iOS 全流程指南,开发签名、IPA 上传与使用 开心上架 跨平台自动化上架实践