如何通过策略模式简化 if-else?

用设计模式消除大量if-else 前言 先来看张经典的啊都给神图,感受下大量if-else的“魅力” 有时候业务上的拖拉可能要求我去写出如上的多层if-else嵌套代码,如果你碰上了一个对团队成员要求相对比较严格的主管的话,那么恭喜你,死定了……脾气比较爆的大佬可能直接就跟你说要么解决上面问题,要么收拾包袱滚蛋了。 那上述代码能否用设计模式相关解决呢,答案是:YES,可以用策略模式+工厂模式。 限于本文篇幅,上述的两种... 阅读详情

1.什么是策略模式?

Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

策略模式(Strategy Pattern):定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。

2.策略模式定义

①Context封装角色

它也叫做上下文角色, 起承上启下封装作用, 屏蔽高层模块对策略、 算法的直接访问,封装可能存在的变化。

②Strategy 抽象策略角色

策略、 算法家族的抽象, 通常为接口, 定义每个策略或算法必须具有的方法和属性。

③ConcreteStrategy 具体策略角色

实现抽象策略中的操作, 该类含有具体的算法。

3.策略模式通用代码

public class Context {
    // 抽象策略
    private Strategy strategy = null;
    // 构造函数设置具体策略
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    // 封装后的策略方法
    public void doAnything(){
        this.strategy.doSomething();
    }
}
public interface Strategy {
    // 策略模式的运算法则
    public void doSomething();
}
public class ConcreteStrategy1 implements Strategy{
    @Override
    public void doSomething() {
        System.out.println("ConcreteStrategy1");
    }
}
public class ConcreteStrategy2 implements Strategy{
    @Override
    public void doSomething() {
        System.out.println("ConcreteStrategy2");
    }
}

测试:

public class StrategyClient {
    public static void main(String[] args) {
        // 声明一个具体的策略
        Strategy strategy = new ConcreteStrategy1();
        // 声明上下文对象
        Context context = new Context(strategy);
        // 执行封装后的方法
        context.doAnything();
    }
}

4.用策略模式改写if-else

假设我们要处理一个office文件,分为三种类型 docx、xlsx、pptx,分别表示Word文件、Excel文件、PPT文件,根据文件后缀分别解析。

4.1 常规写法

public class OfficeHandler {

    public void handleFile(String filePath){
        if(filePath == null){
            return;
        }
        String fileExtension = getFileExtension(filePath);
        if(("docx").equals(fileExtension)){
            handlerDocx(filePath);
        }else if(("xlsx").equals(fileExtension)){
            handlerXlsx(filePath);
        }else if(("pptx").equals(fileExtension)){
            handlerPptx(filePath);
        }
    }

    public void handlerDocx(String filePath){
        System.out.println("处理docx文件");
    }
    public void handlerXlsx(String filePath){
        System.out.println("处理xlsx文件");
    }
    public void handlerPptx(String filePath){
        System.out.println("处理pptx文件");
    }
    private static String getFileExtension(String filePath){
        // 解析文件名获取文件扩展名,比如 文档.docx,返回 docx
        String fileExtension = filePath.substring(filePath.lastIndexOf(".")+1);
        return fileExtension;
    }
}

处理逻辑全部放在一个类中,会导致整个类特别庞大,假设我们要新增一种类型处理,比如对于2007版之前的office文件,后缀分别是 doc/xls/ppt,那我们得增加 else if 逻辑,违反了开闭原则,如何解决这种问题呢,答案就是通过策略模式。

4.2 策略模式改写

public interface OfficeHandlerStrategy {
    void handlerOffice(String filePath);
}
public class OfficeHandlerDocxStrategy implements OfficeHandlerStrategy {
    @Override
    public void handlerOffice(String filePath) {
        System.out.println("处理docx");
    }
}

// 省略 OfficeHandlerXlsxStrategy/OfficeHandlerPptxStrategy 类

public class OfficeHandlerStrategyFactory {
    private static final Map<String,OfficeHandlerStrategy> map = new HashMap<>();
    static {
        map.put("docx",new OfficeHandlerDocxStrategy());
        map.put("xlsx",new OfficeHandlerXlsxStrategy());
        map.put("pptx",new OfficeHandlerPptxStrategy());
    }
    public static OfficeHandlerStrategy getStrategy(String type){
        return map.get(type);
    }
}

测试:

public class OfficeHandlerStrategyClient {
    public static void main(String[] args) {
        String filePath = "C://file/123.xlsx";
        String type = getFileExtension(filePath);
        OfficeHandlerStrategy strategy = OfficeHandlerStrategyFactory.getStrategy(type);
        strategy.handlerOffice(filePath);
    }

    private static String getFileExtension(String filePath){
        // 解析文件名获取文件扩展名,比如 文档.docx,返回 docx
        String fileExtension = filePath.substring(filePath.lastIndexOf(".")+1);
        return fileExtension;
    }
}

4.策略模式优点

①算法可以自由切换

这是策略模式本身定义的, 只要实现抽象策略, 它就成为策略家族的一个成员, 通过封装角色对其进行封装, 保证对外提供“可自由切换”的策略。

②避免使用多重条件判断

简化多重if-else,或多个switch-case分支。

③扩展性良好

增加一个策略,只需要实现一个接口即可。

5.策略模式应用场景

①多个类只有在算法或行为上稍有不同的场景。

②算法需要自由切换的场景。

③需要屏蔽算法规则的场景。

 

Android 多条if-else条件语句简化之策略模式 Android 多条if-else条件语句简化之策略模式 一、遇到的问题 在项目实际开发中,有时会遇到根据类型去做不同的处理,这时就会用到if-else条件语句进行判断并进行逻辑处理。从功能的设计上来说,使用if--else进行逻辑判断也没有什么不妥,但是从架构设计来说,这种方式其实是非常不优雅的,因为如果需要添加更多的出行方式,就必须去修改原有的代码,这会直接导致代码块臃肿、扩展性差以及后期维护困难,更违反了设计模式中的”开放-封闭”原则。那么应该如何去改进它呢?答案是:策略模式! 二、策略模式简介 阅读详情

相关推荐

⭐️白嫖的阿里云认证⭐️ 【真题&参考答案】:大模型Clouder认证:利用大模型提升内容生产能力

【摘要】真题「大模型Clouder认证:利用大模型提升内容生产能力」

davidkorhenn的博客 1935

优化代码之使用策略模式(解决if..else..问题)

策略模式是指**有一定行动内容的相对稳定的策略**名称。策略模式在古代中又称“计策”,简称“计”,如《汉书·高帝纪上》:“汉王从其计”。这里的“计”指的就是计谋、策略。策略模式具有相对稳定的形式,如“避实就虚”、“出奇制胜”等。一定的策略模式,既可应用于战略决策,也可应用于战术决策;既可实施于大系统的全局性行动,也可实施于大系统的局部性行动。

Xmumu_的博客 1107

Avalonia 项目结构说明

Avalonia UI

bjxingch的博客 1273

Java设计模式之(十四)——策略模式

1、什么是策略模式? Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 策略模式(Strategy Pattern):定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。 2、策略模式定义 ①、Context封装角色 它也叫做上下文角

IT可乐 518

别再为格式发愁:safetensors转GGUF的三种高效方法及Ollama集成对比

本文详细介绍了将safetensors格式转换为GGUF格式的三种高效方法,包括llama.cpp原生转换、GGUF官方工具链和Transformers中转方案,并对比了它们在Ollama集成中的表现。文章还提供了实际项目中的踩坑经验和性能调优建议,帮助开发者快速掌握模型转换技术。

weixin_42651281的博客 641

基于Python的虚拟货币社区情绪分析与市场价格预测爬虫实现

本文探讨了如何利用Python爬虫技术获取虚拟货币社区数据,并通过情感分析预测市场价格走势。我们将使用最新的异步爬虫框架、自然语言处理技术和机器学习模型,构建一个完整的社区情绪分析系统。本文提供了详细的代码实现和理论解释,适合作为毕业设计参考。关键词:Python爬虫、虚拟货币、情感分析、价格预测、异步爬虫、机器学习爬虫框架aiohttp和httpx用于异步HTTP请求HTML解析和parsel数据存储MongoDB和Pandas用于数据处理自然语言处理库和VADER情感分析工具机器学习和。

2201_76125261的博客 524

策略模式解决if-else问题

这种模式支持开闭原则,在不修改现有代码的前提下,动态的添加、删除、替换算法。策略模式是一种行为设计模式,它允许在运行时根据不同的情况来选择不同的策略。:它是一个接口,具体的策略实现类去实现这个接口,就可以提供不同的实现方式。2、提高代码可读性:不同的业务处理在不同的策略实现类中,易于理解和维护。1、易于拓展:不需要修改原有代码,方便的增加、删除算法。可以根据需要来修改策略,或者定义一个工厂类。以Strategy接口实现某具体算法。3、避免大量的if-else语句。

weixin_43005845的博客 1197

基于FPGA的车道线检测系统设计

本文设计了一种基于FPGA的车道线检测系统,采用Altera Cyclone IV EP4CE10F17C8作为主控芯片,结合OV7725摄像头和LCD显示屏实现实时车道线检测。系统通过硬件流水线处理架构,依次完成图像采集、灰度转换、中值滤波、Sobel边缘检测和Hough变换直线识别等功能模块。所有模块均采用Verilog HDL实现,充分利用FPGA的并行处理能力,显著提升了系统响应速度。测试结果表明,该系统能够有效检测道路车道线,满足实时性要求,为ADAS系统提供了一种高效的硬件解决方案。

huanghm88的专栏 124

Java中如何使用策略模式减少 if / else 分支的使用

Java中如何使用策略模式减少 if / else 分支的使用

林夕 2035

YOLOv12涨点改进 | 独家创新-注意力改进篇 | ECCV 2024 | YOLOv12引入AgentAttention代理注意力模块,兼顾 Softmax 和线性注意力优点,提高检测精度

🔥本文给大家介绍使用Agent Attention模块改进YOLOv12网络模型。其主要作用是通过引入高效的代理token来减少计算复杂度,同时保留全局上下文建模能力。相比传统的Softmax注意力,Agent Attention通过代理token聚合并广播信息,从而降低了模型在处理高分辨率图像时的计算负担,并显著提高了推理速度。其优势在于保持了目标检测中的全局信息处理能力,同时加速了生成过程,特别是在高分辨率场景下,可以提高检测精度、减少内存消耗,并提升处理速度。

Ai缝合怪、助力小伙伴高效发论文 156

从点击图标到Activity亮屏:AMS、Zygote、ActivityThread的Binder协作之旅

Launcher通过Context调用 startActivity(),最终会通过 Activity.startActivity() 传递到 ActivityManager.getService(),获取AMS的Binder代理对象(IActivityManager)。这里的 attach() 方法通过Binder调用AMS的 attachApplication(),将新进程的 IApplicationThread 代理对象传递给AMS。这一步的Binder通信,是整个启动流程的关键转折点,值得细细品味。

大模型大数据攻城狮的专栏 1071

Java--使用工厂+策略模式解决if-else/switch分支过多的问题(含demo)

一、前提 在平时的开发过程中,你是否遇到过以下问题: 1.sonar扫描代码圈复杂度过高,需要减少if-else分支及switch分支。 2.某个类中/某个方法的代码太多,难以维护。 代码中业务分支过多时,代码可读性会变得很差,大量的代码堆积在一个类中,也会变得难以维护。 遇到这些问题,说明你:该拆分啦!! 使用Spring的工厂管理+策略模式可以很好的解决这个问题。 二、策略模式的介绍 策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每.

stalin_的博客 3695

Vivado报错-4 [Routed 35-3424] SLL Assignment failed ILP VU19P

Vivado报错[Routed 35-3424] SLL Assignment failed ILP VU19P

weixin_39896700的博客 1409

通过策略模式简化 if-else

可以通过策略模式进行算法可以自由切换,这是策略模式本身定义的, 只要实现抽象策略, 它就成为策略家族的一个成员, 通过封装角色对其进行封装, 保证对外提供“可自由切换”的策略。策略模式改写,简化多重if-else,或多个switch-case分支。...

琅枫的博客 838

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

if/else简化之策略模式(了解)

if/else 在日常开发中,基于业务的复杂,需要对不同的场景进行判断,每当多出一种情况,那么又要新增一条if/else,这样让代码看起来非常的冗长以及修改起来很麻烦,刚才看到其中一种思路,应用到了设计模式中的策略模式。 设计模式有20多种包括:单例,适配器、策略、工厂…这里仅仅是其中一种,算是我自己对刚敲的案例的理解和总结吧。我算是萌新吧,如果觉得啰嗦请谅解一下~ 需求场景 一个聊天平台,由于双...

zhzhoudh的博客 859

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

使用策略模式结合InitializingBean或ApplicationContextAware简化if-else

使用策略模式或ApplicationContextAware简化if-else

爱学习的软件开发的博客 1154

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

策略模式简化写法 来优化if else逻辑

策略模式简化写法 来优化if else逻辑

weixin_45406536的博客 202

java-策略模式干掉 if else

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com 作者:cipher http://www.ciphermagic.cn/spring-boot-without-if-else.html 需求 这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。 订单实体: service 接口: 传统实现 根据订单类型写一堆的 if else: 策略模式实现 利用策略模式,只需要两行即可实现业务逻辑: 可.

嘻哈熊的专栏 715

java if else 如何简化_if else 简化写法

哎,曾几何时想当年,其实我也特别钟情于 if/else连环写法,上来就是一顿SAO操作,比如举个好理解的简单栗子:一般来说我们正常的后台管理系统都有所谓的角色的概念,不同管理员权限不一样,能够行使的操作也不一样,比如:系统管理员( ROLE_ROOT_ADMIN):有 A操作权限订单管理员( ROLE_ORDER_ADMIN):有 B操作权限普通用户( ROLE_NORMAL):有 C操作权限比如...

weixin_39629947的博客 2773

java 策略模式if else_利用策略模式优化过多 if else 代码

前言不出意外,这应该是年前最后一次分享,本次来一点实际开发中会用到的小技巧。比如平时大家是否都会写类似这样的代码:if(a){//dosomething}else if(b){//doshomething}else if(c){//doshomething} else{////doshomething}条件少还好,一旦 else if 过多这里的逻辑将会比较混乱,并很容易出错。比如这样:摘自 ci...

weixin_31358991的博客 290

java实现策略模式-简化if-else 降低圈复杂度

1.定义一个策略接口 public interface IPriceStrategy { /** * 处理数据 * @param QueryReq */ Resp handle(QueryReq queryReq); } 2. 实现类 /** * 算法预测处理 */ @Component(CommonConst.PREFIX_PRICE_STRATEGY + "4") public class MlFunTypeHandle implemen.

ranchan0141的博客 620

CTO:再写if-else,逮着罚款1000!

通常,我发现,如果方法提供了无效的值,则继续执行是没有意义的。作为初级开发人员,您可能会倾向于通过添加额外的 If-Else(即 else-if)语句来做到这一点。是的,这是更多代码的方式。正确的方法是遵循 SOLID 原则的方法,我们通过实施动态类型发现过程(在本例中为策略模式)来做到这一点。如果你要根据提供的某些输入为变量分配新值,请停止 If-Else 废话,一种更具可读性的方法。在此阶段使用 If-Else 并不是什么大问题,如果我们可以轻松替换其他,只要如前所述即可。这是一个稍微高级的示例。

2501_90251017的博客 385

告别臃肿的switch/if-else:用查表法、策略模式与规则引擎重构业务逻辑

在软件工程中,复杂的业务逻辑常导致代码出现冗长的条件分支(俗称“开关场”),严重影响可维护性与可测试性。其本质是过度依赖命令式编程,将‘如何做’的流程控制细节与‘做什么’的业务规则混为一谈。通过声明式与数据驱动的思维,可以将离散的条件分支重构为可计算的‘公式’,即将业务规则抽象为对数据状态的转换。这种重构的核心技术价值在于提升代码的模块化、可配置性与扩展性,尤其适用于电商折扣计算、物流费用核算、状态机管理等高频业务场景。本文以重构switch/if-else为例,深入解析查表法、策略模式与规则引擎三种实战模

weixin_34116482的博客 354

js利用策略模式优化if else循环

js程序中最常用的if else循环,如果分枝很多的的情况下难免使写出的程序又臭又长,但是根据需求又必须将这些分支处理,此时稍有经验的程序员可能会想到用switch case优化但是只是仅仅做到利于阅读,最好的方法是用策略模式进行优化。 例如 有五个对象 obj1 = { name:“obj1”, option:{ do:“case1” } } … obj5 = { name:“obj5”, op...

weixin_40073115的博客 2812

Java 中消除 If-else 技巧总结

if-else虽然简单直接,但并不是解决逻辑问题的最佳选择。在大型项目中,过度依赖if-else会导致代码臃肿、难以维护。通过使用字典、策略模式以及前置条件检查等技巧,我们不仅可以摆脱冗长的分支逻辑,还能提升代码的可读性和可扩展性。让你的代码更加优雅,从减少if-else开始!

龚小帅的博客 1627
上一篇: Apollo 太重,最终选择了 Nacos
下一篇: 图解 Kafka 网络层实现机制之 Selector 多路复用器
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值