策略模式:【利于扩展,消除if的模式】

Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析) 在最近的后端开发中,多多少少会发现有很多if-else语句,如果条件过多则会造成整体代码看起来非常臃肿。本篇博客汇总了我对工厂模式和策略模式的理解,以及我是如何把它们巧妙运用在实际项目当中的一些技巧进行了分享,如有问题,欢迎评论区讨论! 阅读详情

1.前言

对于大多数多种类型的逻辑代码,我们一般的做法一般是通过if来进行判断,然后再{}里进行逻辑代码的编写,如下述

package org.example.designpattern.strategy;

public class LoginNoDesign {

    /**
     * 登录方法, 不使用策略模式时, 对于流程的扩展如新增一种登录方式只能添加if
     *
     * @param username 用户名
     * @param password 密码
     * @param type     登录方式
     */
    public void login(String username, String password, String type) {
        if ("mobile".equals(type)) {
            // 手机号登录
            System.out.println("手机号登录成功");
        } else {
            // 用户名密码登录
            System.out.println("用户名密码登录成功");
        }
    }
}

但这种代码给整个方法增添了一种臃肿,往往一个方法需要大几十甚至上百行代码。

二.策略模式介绍

策略模式是行为模式的一种,也是消除if的重要手段,通过对于同类逻辑的不同策略来实现替代,如我们有多种登陆方式,那么可以先定义某种type对应某种策略,在使用时通过type来获取对应执行策略。

三.代码实现

package org.example.designpattern.strategy;

public interface ILogin {

    /**
     * 登录方法
     *
     * @param username 用户名
     * @param password 密码
     * @param type     登录方式
     */
    void login(String username, String password, String type);
}

package org.example.designpattern.strategy;

public class MobileLogin implements ILogin{

    @Override
    public void login(String username, String password, String type) {
        System.out.println("手机号登录成功");
    }
}

package org.example.designpattern.strategy;

public class UsernameLogin implements ILogin{

    @Override
    public void login(String username, String password, String type) {
        System.out.println("用户名密码登录成功");
    }
}

测试

package org.example.designpattern.strategy;

import org.junit.Test;

public class StrategyTests {

    @Test
    public void test() {
        LoginNoDesign loginNoDesign = new LoginNoDesign();
        loginNoDesign.login("root", "root", "username");

        // 策略模式
        ILogin login = new MobileLogin();
        login.login("13903291525", "", "mobile");
    }
}

对比

通过类型将各自实现分开,这样将原来的耦合的代码分开,在某种类型逻辑需要修改维护时也不需要测试其他已经跑通的逻辑。

扩展

结合工厂模式,预定义对应类型所执行的策略

package org.example.designpattern.strategy;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class LoginServiceFactory {

    private static Map<String, ILogin> loginMap = new ConcurrentHashMap<>();

    static {
        loginMap.put("mobile", new MobileLogin());
        loginMap.put("username", new UsernameLogin());
    }

    public static ILogin getLoginService(String type) {
        return loginMap.get(type);
    }
}

测试

package org.example.designpattern.strategy;

import org.junit.Test;

public class StrategyTests {

    @Test
    public void test() {
        LoginNoDesign loginNoDesign = new LoginNoDesign();
        loginNoDesign.login("root", "root", "username");

        // 策略模式
        ILogin login = new MobileLogin();
        login.login("13903291525", "");

        // 结合工厂
        ILogin login1 = LoginServiceFactory.getLoginService("mobile");
        login1.login("13903291525", "");
    }
}

四.总结

策略模式并不复杂,通过策略模式可以优化掉代码中的大量if,可以极大的提高系统的扩展性

 

【Java硬核知识:设计模式落地误区】策略模式+工厂模式:消除业务代码中的if - else瘟疫 摘要:在Java开发中,大量的if - else语句会让代码变得臃肿、难以维护,还会降低代码的可读性和可扩展性。本文深入探讨了如何结合策略模式和工厂模式来消除业务代码中的if - else瘟疫。详细介绍了使用Map维护策略实例、在Spring中利用ApplicationContext自动注册策略以及结合注解实现策略的自动发现等方法。通过实操流程和完整代码示例,帮助开发者更好地理解和运用这两种设计模式,优化业务代码结构。 阅读详情

相关推荐

类银河恶魔城学习记录1-1 Player状态机的搭建 P28

什么是状态机?一篇文章就够了 - 知乎说实话,目前并不能深入理解状态机的奇妙之处(当然,我觉得状态机作为教程的重要组成部分是不得不理解的,所以以下我会对游戏教程内的状态机做一些我认为的解释,如有错误,请多包涵)

Homura_的博客 2343

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

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

林夕 2035

企业微信消息推送API实战:5步搞定可信IP与域名配置(含Python代码示例)

本文详细解析了企业微信消息推送API实战中的关键配置步骤,特别是可信IP与可信域名的配置流程。通过5个清晰步骤,结合Python代码示例,指导开发者快速完成安全通信链路搭建,避免常见错误,确保消息推送服务稳定可靠。

qsc9012345的博客 998

java 使用策略模式减少if

使用策略模式:策略模式将不同的策略封装成独立的类,避免使用大量的条件语句。通过定义一个策略接口,然后针对不同的情况实现不同的策略类,根据需要选择合适的策略进行处理。使用映射表:将条件与对应的操作放入一个映射表中,避免使用大量的 if-else 语句。使用多态:通过使用面向对象的多态特性,可以将不同的逻辑封装到不同的类中,避免大量的 if。使用枚举:使用枚举可以将条件与对应的操作封装到枚举常量中,避免使用大量的 if-else。使用继承和接口来定义通用的方法,并让具体的实现类实现这些方法。

beautifull001的博客 604

双轴按键摇杆模块原理与嵌入式驱动实战

双轴按键摇杆是一种融合模拟量(X/Y轴)与数字量(Z轴按键)的复合型人机交互传感器,其本质基于电位器分压原理与机械开关通断特性。通过ADC采集连续电压信号并结合数字IO检测按键状态,可实现高鲁棒性的二维运动感知与触发控制。该方案技术门槛低、成本可控、兼容性强,广泛应用于智能小车、DIY游戏手柄、工业HMI及教育开发板等嵌入式场景。文中深入解析电位器线性度、KEY引脚开漏特性、ADC参考电压稳定性及软件消抖状态机等关键工程要素,为基于Arduino、STM32或ESP32平台的快速集成提供可复用的技术路径。

weixin_30995917的博客 85

CNC雕刻与VCarve Pro实战:将三维地形数据转化为木质景观时钟

计算机辅助制造(CAM)是现代数字制造的核心技术之一,它通过软件将设计模型转化为机床可执行的指令,驱动设备进行精准加工。其原理在于将三维模型离散为刀具运动路径(G代码),控制铣刀等执行机构进行“减材”成型。这项技术的价值在于实现了复杂三维形体的高精度、可重复制造,极大地拓展了创意实现的边界。在应用场景上,CAM广泛应用于模具加工、原型制作、个性化工艺品制造等领域。本文聚焦于一个具体实践:利用VCarve Pro软件,结合从在线地图服务获取的真实地形STL数据,通过CNC雕刻机在硬木上加工出具有真实地理特征的

weixin_30651345的博客 379

设计模式-策略模式(彻底消除if-else结构)

策略模式属于11种行为型模式之一策略模式(strategy pattern)的原始定义是:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化实际生活中常常遇到需要选择策略的场景,比如乘坐交通工具,可以选择飞机火车等在开发中,比如网购支付功能,支付时可以选择支付算法,可以是支付宝支付,也可以是xxx银行支付等待,这些提供的算法一致(付款),就是一种策略。

hey_lie的博客 1764

基于Xilinx的I2S Receiver IP核和I2S Transmitter IP核音频验证

基于Xilinx的I2S Receiver IP核和I2S Transmitter IP核音频验证 文章目录前言一、工程构架二、Xilinx IP的配置1.I2S Transmitter IP配置:2.I2S Receiver IP配置:3.WM8960的配置:总结 前言 本实验基于Xilinx ZU4EV平台,也适用于ZYNQ平台。音频验证完成,记录调过程。 ①Xilinx 音频IP只支持主模式,左对齐或右对齐方式,16bit或24bit字长。 ②WM8960器件作为从模式;24bit字长;数据传输格

weixin_45637597的博客 6815

设计模式之【策略模式】,去掉繁琐的if-else,实现算法的动态替换

策略模式(Strategy Pattern)又叫政策模式(Policy Pattern),它是将定义的算法家族分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。属于行为型模式。策略模式使用的就是面向对象的继承和多态机制,从而实现同一行为在不同场景下具备不同实现。

秃了也弱了 5044

Opencv全景图像处理实战:柱面与透视展开技术详解

本文详细解析了使用OpenCV实现全景图像处理的两种核心技术:柱面展开与透视展开。通过原理拆解与实战代码演示,指导开发者将360度环绕的鱼眼或球面图像转换为可用的平面视图,适用于街景展示、车载环视、室内测量等计算机视觉应用场景。

weixin_29081163的博客 585

手把手教你学PCIE-- 热插拔电路设计与实现方案

PCIe热插拔(Hot-Plug)技术允许用户在系统运行时安全地插入或移除设备,而无需重启系统。本文将深入讲解热插拔电路的设计要点、关键器件选型及信号协议规范,涵盖机械结构、电气保护和电源管理三大核心模块。​。

MHD0815的博客 440

Java代码中采用策略模式消除大量的 if else代码结构

策略(Strategy)模式:又名Policy,它的用意是定义一组算法,把它们一个个封装起来,并且使他们可以相互替换。策略模式可以独立于使用他们的客户端而变化。 策略模式有以下角色构成: 1、抽象策略(Strategy)角色:抽象策略角色由抽象类或接口来承担,它给出具体策略角色需要实现的接口; 2、具体策略(ConcreteStrategy)角色:实现封装了具体的算法或行为; 3、场景(C...

zhuzj12345的博客 9359

YOLOv11 改进 - SPPF模块 | 发论文神器!LSKA注意力改进SPPF,增强多尺度特征提取能力,高效涨点!!!

本文介绍了Large Separable Kernel Attention (LSKA)模块及其在YOLOv11中的结合应用。LSKA旨在解决Visual Attention Networks (VAN)使用大内核卷积时的计算效率问题,通过将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核,降低了计算复杂度和内存占用,且使VAN更关注物体形状。我们将集成LSKA的SPPF_LSKA模块引入YOLOv11,大量实验表明,改进后的模型在对象识别、检测、分割和稳健性测试上表现出色。

魔改工程师的博客 1281

Java设计模式——策略模式

策略模式 1.策略模式简介 策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化 2.模式结构 策略模式包含如下角色: Strategy: 抽象策略类:策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法(如下图的algorithm()) Context: 环境类 /上下文类: 上下文是依赖于接口的类(

涛涛的个人博客 9万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SpringBoot使用策略模式彻底消除if-else

使用策略模式和工厂模式彻底消除if-else分支

不当初 3960

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

设计模式-策略模式

策略模式(strategy pattern)的原始定义是:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。

鱼粉大王 8522

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

策略模式:一篇文章告别 if-else 炼狱【C++】【设计模式】

策略模式是一种行为型设计模式,它定义了一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式使得算法可以独立于使用它的客户端而变化。将变化的“行为”从不变的“骨架”中抽离出来,让它们各自独立,然后可以在运行时根据需要进行替换。你有一个乐高机器人(上下文),它有手臂(可以执行动作)。你可以为机器人安装不同的手臂(具体策略):有的手臂可以抓取物品,有的手臂可以发射炮弹,有的手臂可以挥舞光剑。这些手臂都遵循一个共同的接口(策略接口):它们都能“执行动作”。

2301_78977377的博客 2249

工厂模式+策略模式消除 if else 实战

工厂模式与策略模式的结合能够有效解决客户端与具体策略类之间的强耦合问题,并封装复杂的创建逻辑。单独使用策略模式时,客户端需要直接实例化具体策略类,导致代码重复和违反“迪米特法则”。通过引入工厂模式,客户端只需通过工厂获取策略实例,无需关心具体策略的创建细节,符合“依赖倒置原则”和“单一职责原则”。此外,这种结合支持动态切换策略,新增策略时只需扩展工厂和策略类,无需修改客户端代码,符合“开闭原则”。

hraceo的专栏 817

设计模式探索:策略模式

策略模式(Strategy Pattern)的原始定义是:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。策略模式通过定义一系列算法,将每一个算法封装起来,并使它们可以相互替换,从而让算法可以独立于使用它的客户端而变化。通过使用策略模式,可以提高代码的扩展性、可读性和维护性,同时也可以消除大量的条件语句。

搬砖的小熊猫的博客 1647

策略模式消除IF ELSE

问题描述: 在你的代码中是否会出现这种情况,用很多的if else语句来执行对应的功能模块,并且各个分支模块中共同的部分也还不少,当后续迭代量上来后,随之而来的模块分支可能也会增多,有什么方法可以消除分支吗? public String sayHello(String type) { //不同的类型有不能的业务处理,导致if else太多太多。宝宝心里苦啊................

即心即佛 840

设计模式之策略模式(如何优雅的去除if-else逻辑代码)

设计模式之策略模式(如何优雅的去除if-else逻辑代码) 项目要求: 新增一个数据接收的接口,接收来自不同渠道的数据进行个性化的处理。目前已知的渠道有360、百度,以后还会不断扩展渠道,要求必须在同一个接口处理所有数据接收请求。 大多数的实现是这样的: /** * 点击数据匹配接口 */ ...

honger_hua的博客 5712

工厂+策略模式消除if-else

需求 代码改造: JSONArray result = new JSONArray(); switch (code) { case SUBJECT_IFACE_CODE: for (int i = 0, size = values.size(); i < size; i++) { ...

pyd950812的博客 682

别再用设计模式来消除 if else 了

1.恰到好处的实现功能,不要给代码加入过多假设条件。2.过早使用设计模式可能限制代码的灵活性,虽然是反直觉的,但是现实情况确实如此。3.状态模式和策略模式不一定总是最佳选择,有时简单的if-else更直观。4.工厂模式在代码研发过程中不断清理代码的时候可以自然引入,不需要刻意套用。

weixin_74412978的博客 1936

公司系统if-else语句太多了,我用设计模式消除了if-else

我在之前的文章中使用枚举消除了if-else语句,有兴趣的可以看看我的这篇文章: “ 如何用枚举消除if/else?-枚举高阶用法 ” 这次我采用其他方式消除if-else。 背景 你在平时开发中肯定有使用if-else语句的时候,然而大量的if-else语句不利于代码阅读,影响代码复杂度。反正我在消除Sonar异味的时候头疼过。 之前公司系统的代码中也存在if-else过多问题,导致代码不优雅,这里为了讲解,我将业务逻辑简化。 假如我有一个计算实际价格的方法,要求输入用户的级别和商品的实际价格

wujialv的博客 1799

策略模式消除恶心的if else

一 . 什么是策略模式 策略模式是对算法的包装,把使用算法的责任和算法本身分隔开,委派给不同的对象管理。策略模式通常把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。 简单来说就是就定义一个策略接口,子类策略去实现该接口去定义不同的策略。然后定义一个环境(Context)类,以策略接口作为成员变量,根据环境来使用具体的策略。 二. 使用场景 ...

weixin_30379911的博客 676
上一篇: 收下我的膝盖 阿里架构师编写的668页Java虚拟机笔记真强
下一篇: MySQL主从复制原理和使用
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值