使用策略模式替代 if-else 的 Java 实现

【设计模式系列2】如何使用策略模式替换编程中大量的if判断 public interface PayStrategry { boolean pay(int money);//支付 BigDecimal queryBalance(String accountNo);//查询余额 } 2、接下来定义2个实现类示例 import com.zwx.design.pattern.PayStrategy; import java.math.BigDecimal; public class AliPayStrategy implements PayStrategy { @Over 阅读详情

策略模式是一种面向对象设计模式,它允许在运行时选择算法的行为。相比于使用大量的 if-else 语句来实现不同的条件分支,策略模式提供了一种更加灵活和可扩展的方式来管理不同的行为,同时降低了代码的复杂性。

在本文中,我们将使用 Java 编程语言来展示如何使用策略模式来替代 if-else 语句。

问题背景

假设我们正在开发一个游戏,其中有多个角色,每个角色都有不同的攻击方式。根据角色的类型,我们需要执行不同的攻击逻辑。传统的解决方案是使用 if-else 语句来判断角色的类型,并执行相应的攻击逻辑。下面是一个简单的示例代码:

public class GameCharacter {
    private String type;
    
    public GameCharacter(String type) {
        this.type = type;
    }
    
    public void attack() {
        if (type.equals("warrior")) {
            System.out.println("Warrior attacks with a sword.");
        } else if (type.equals("mage")) {
            System.out.println("Mage attacks with a spell.");
        } else if (type.equals("archer")) {
            System.out.println("Archer attacks with a bow.");
        } else {
            System.out.println("Unknown character type.");
        }
    }
}

上述代码中,GameCharacter 类根据传入的角色类型执行不同的攻击逻辑。但是,如果我们需要添加更多的角色类型或者修改现有的角色类型时,就需要修改 attack 方法中的 if-else 语句,这样会导致代码的可维护性变差。

使用策略模式

为了使用策略模式来替代 if-else 语句,我们首先需要定义一个策略接口(AttackStrategy),该接口包含一个 attack 方法,用于执行攻击逻辑。然后,我们可以为每个角色类型实现一个具体的攻击策略类,这些策略类都实现了 AttackStrategy 接口。最后,在 GameCharacter 类中引入一个成员变量来存储具体的攻击策略,并在 attack 方法中调用该策略的 attack 方法。

下面是使用策略模式重构后的代码:

public interface AttackStrategy {
    void attack();
}

public class SwordAttackStrategy implements AttackStrategy {
    @Override
    public void attack() {
        System.out.println("Warrior attacks with a sword.");
    }
}

public class SpellAttackStrategy implements AttackStrategy {
    @Override
    public void attack() {
        System.out.println("Mage attacks with a spell.");
    }
}

public class BowAttackStrategy implements AttackStrategy {
    @Override
    public void attack() {
        System.out.println("Archer attacks with a bow.");
    }
}

public class GameCharacter {
    private AttackStrategy attackStrategy;
    
    public GameCharacter(AttackStrategy attackStrategy) {
        this.attackStrategy = attackStrategy;
    }
    
    public void attack() {
        attackStrategy.attack();
    }
}

在上述代码中,我们首先定义了一个 AttackStrategy 接口,包含了 attack 方法。然后,我们为每个角色类型实现了具体的攻击策略类:SwordAttackStrategy、SpellAttackStrategy 和 BowAttackStrategy。这些策略类分别实现了 AttackStrategy 接口,并实现了各自的攻击逻辑。

接下来,在 GameCharacter 类中引入了一个成员变量 attackStrategy,用于存储具体的攻击策略。在构造方法中传入相应的策略对象,并在 attack 方法中调用 attackStrategy 的 attack 方法。

现在,我们可以通过创建不同的攻击策略对象来实例现不同类型的角色,并调用它们的 attack 方法。下面是示例代码:

public class Main {
    public static void main(String[] args) {
        AttackStrategy warriorStrategy = new SwordAttackStrategy();
        GameCharacter warrior = new GameCharacter(warriorStrategy);
        warrior.attack(); // 输出:Warrior attacks with a sword.
        
        AttackStrategy mageStrategy = new SpellAttackStrategy();
        GameCharacter mage = new GameCharacter(mageStrategy);
        mage.attack(); // 输出:Mage attacks with a spell.
        
        AttackStrategy archerStrategy = new BowAttackStrategy();
        GameCharacter archer = new GameCharacter(archerStrategy);
        archer.attack(); // 输出:Archer attacks with a bow.
    }
}

在上述代码中,我们创建了一个 SwordAttackStrategy 对象作为战士的攻击策略,并将其传递给 GameCharacter 类的构造方法。同样地,我们创建了 SpellAttackStrategy 和 BowAttackStrategy 对象作为法师和弓箭手的攻击策略,并将它们分别传递给相应的 GameCharacter 对象。最后,我们调用每个角色对象的 attack 方法,分别输出了不同的攻击方式。

通过使用策略模式,我们成功地将原本使用 if-else 语句实现的条件分支逻辑转化为了一组可复用的策略类。这种方式使得代码更加灵活、可扩展,并且提高了代码的可维护性。

总结:

  • 策略模式是一种用于管理不同行为的设计模式。
  • 通过定义一个策略接口和多个具体的策略类来实现策略模式。
  • 使用策略模式可以替代复杂的 if-else 语句,并提高代码的可维护性和可扩展性。
  • 在具体的环境类中引入一个策略对象,并在需要时调用策略对象的方法。

希望本文对你理解如何使用策略模式替代 if-else 语句有所帮助。如果有任何疑问,请随时提出。

Java函数式实现替代策略模式解决 if...else代码,Map+函数式接口方法 之前记录过用自定义注解和策略模式实现发不同消息的功能笔记: 文章地址:发送不同类型的消息----------策略模式_不受天磨非好汉,不遭人妒是庸才——着实着迷゛-优快云博客r一:首先看下代码结构annotation:注解context:调度容器(会存放不同消息策略实现列表)enums:不同消息类型的枚举listener:springboot项目初始化的时候初始化消息策略实现与枚举类型的绑定关系并加入到调度容器里面service:消息接口定义impl:具体消息策略实现二:具体代码讲解1:消息类型枚举:M 阅读详情

相关推荐

波士顿咨询最新发布《2025年全球支付报告:未来不稳定》:到2029 年,支付收入将预计达到 2.4 万亿美元

波士顿咨询最新发布《2025年全球支付报告:未来不稳定》:到2029 年,支付收入将预计达到 2.4 万亿美元

face light~ 917

策略模式:精妙替代你的if-else

1、策略模式并不是什么高大上的东西,其本质是利用map的哈希结构,优化了if-else等不优雅的代码结构。2、除了多个函数需要封装在一个抽象类的情况,采用JDK1.8的函数式接口可以更有效的简化代码。

qq_43842093的博客 9399

2026年5月典型AI应用落地

2026年5月AI应用全面进入商用化阶段,呈现三大特征:产业端深度渗透核心业务场景,如法律领域AI合同处理系统完成8500万元项目;消费端实现规模普及,京东618全场景AI化,智能家居产品涌现;基础设施层面运营商推出词元套餐降低使用门槛。政策法规与国际合作同步推进,日本通过首部AI专项法律,中国举办多场产业对接会。AI应用从技术验证转向实效产出,进入精算回报的成熟期。

AI_Encyc的博客 2631

巧用Java策略模式取代 if else

策略模式可以将分类细分到不同的类进行处理,有较高代码可读性和可维护性,但也不是所有场景都适用,对于一些简单的分支处理,使用 if else 就完全可以解决,这种情况下强行使用策略模式反而适得其反,增加的工作量,所以还是需要结合业务场景做选择。

GodSea_611的博客 1391

RK806S PMIC电源管理芯片调试

当点按PWRON按键时,rk806上电开始启动bootloader和uboot,在执行到此处时检测到是由于按键启动的,所以0x5d的值是0x80,0x74的值是0x80,在一般情况下,mode都默认是none的,所以mode值为11,因此就进入了我们的if判断,若是由于按键启动的,则直接调用rk8xx_shutdown函数关掉,进入这个函数会看到实际是通过i2c给0x72寄存器的BIT(0)写1,使其关机。当SoC在12V电源已经接入,且处于关机状态时,使用PWRON按键开机,0x74的值则为0x80。

Y1anoohh的博客 2544

点云从入门到精通技术详解100篇-基于三维点云的机器人抓取位姿检测(续)

集到的深度信息会存在噪点,因此需要将生成的场景点云进行预处理,获得平滑、降采样处理场景点云,本文设计的预处理操作更能从冗杂的场景点云中提取清晰、平滑的目标点云,便于后续的抓取位姿采样,提高后续算法的处理效率。因此需要对场景点云进行适当的分割,仅保留目标物体的点云,整个过程可以通过。场较小时,空间中的点云密度会更加提高;觉子系统的效率,再保持全局点云几何形状不改变的前提下,通过对目标点云进行。体素降采样可以快速地减少点云数据并同时保持点云的形。个点,由于我们实施抓取的目标物体只占整个场景点云图的一部分,

getusushu的博客 774

Java之使用策略模式替代 if-else

通过策略模式,我们将不同的算法(即折扣计算逻辑)封装到独立的策略类中,客户端根据需要选择具体的策略对象。在Java中,通常情况下 if-else 语句用于根据不同条件执行不同的逻辑。而策略模式则是一种设计模式,它允许在运行时选择算法的行为。策略模式的主要思想是将算法封装成独立的对象,使得它们可以相互替换,使得算法的变化独立于使用算法的客户。假设我们有一个根据不同类型的用户给予不同折扣的需求。结构,使得代码更加清晰、扩展性更好,同时也符合面向对象设计的开闭原则(对扩展开放,对修改关闭)。

m0_51014049的博客 967

软考备考:《系统规划与管理师教程》(第2版)第2章——数字ZG与数智化发展

🔴数字化转型的定义:数字化转型是建立在数字化转换、数字化升级基础上,进一步触及组织核心业务,以新建一种业务模式为目标的高层次转型。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 960

Java 枚举实战:3种替代if-else的策略模式实现与性能对比

本文探讨了Java枚举在策略模式中的三种实现方式,通过JMH基准测试对比其性能差异。文章详细介绍了基础枚举策略、带构造函数的枚举策略以及枚举与函数式接口结合的方案,帮助开发者优雅替代传统if-else逻辑,提升代码可维护性和性能。

weixin_34238633的博客 474

基于QT与STM32的电力参数采集系统(华为云IOT)(211)

本项目构建一款集多功能于一体的电力参数采集系统,该系统以高性能、低功耗的STM32F103RCT6微控制器为核心,集成多种传感器与通信模块,实现对电力设施如电压、电流、功率、电能及环境温度等关键参数的实时精确采集,并通过GPS模块获取设备地理位置信息,满足了电力设备状态全面监控的需求。

2902

商品标签识别系统:基于YOLO系列的深度学习实现

随着零售行业的快速发展和自动化需求的增长,商品标签识别技术变得越来越重要。本文详细介绍了一个完整的商品标签识别系统,该系统基于YOLO系列目标检测算法(包括YOLOv5、YOLOv8和YOLOv10),采用PySide6构建用户界面,并提供完整的训练代码和数据集处理方案。该系统能够准确识别商品标签中的关键信息,如价格、条形码、生产日期等,为零售自动化、库存管理和智能结算提供技术支持。

YOLO 349

Springboot 自定义注解实现策略模式 替代工厂模式if...else...和switch

说明: 根据实际工作时遇到的需求,需要将实际项目中的很多if…else…的判断进行替代,提高代码的可维护性和可扩展性。我在网上找了一些方法,结合实际的编写以后在本文中总结归纳。主要目的是记录以便之后使用可以参考,网友如有需要也可借鉴学习。 这个是我参考的博客的地址: https://www.cnblogs.com/houzheng/p/10911462.html#_labelTop 开发工具:ID...

weixin_43955583的博客 4323

ESP32-C3入门教程 蓝牙篇①——基于Blufi 的 WiFi 智能配网

文章目录一、前言二、WiFi配网方式三、快速运行四、运行效果五、ESP32-C3程序流程5.1 主程序5.2 回调函数5.3 SmartConfig线程5.4 流程图六、关键函数6.1 设置SmartConfig的协议类型6.2 启动SmartConfig6.3 停止SmartConfig七、其他八、参考 一、前言 本文基于VS Code IDE进行编程、编译、下载、运行等操作 基础知识点请查阅:ESP32-C3入门教程 基础篇①——基于VS Code构建Hello World 二、WiFi配网方式 W

7765

if-else 优化之 --策略模式

策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 实战用途 ,解决多个if-else导致代码冗余 业务处理主服务类 @Service public class Str...

weixin_45734302的博客 290

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

java反射与ifelse_Java中避免过多if-else的几种方法

太多的if-else不太直观,难以维护。以下面代码为例,展示几种替代if else的方法。String input = "three";@Testpublic void testElse() {if ("one".equals(input)) {System.out.println("one");} else if ("two".equals(input)) {System.out.println...

weixin_39766910的博客 259

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

求求你别再用if-else了,用注解去代替他吧

99套Java企业级实战项目4000G架构师资料策略模式 经常在网上看到一些名为“别再if-else走天下了”,“教你干掉if-else”等之类的文章,大部分都会讲到用策略模式去代替if...

公众号-老炮说Java 431

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

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

java if else 优化_ifelse优化方案

优化 if else:https://blog.youkuaiyun.com/FBB360JAVA/article/details/103832405参考:《阿里巴巴java编码规范》、《设计模式》(清华大学出版)、https://blog.youkuaiyun.com/mifffy_java/article/details/952012891、 阿里编程归约对于控制语句,阿里归约上推荐了一种思路。【推荐】在表达异常的分...

weixin_29116603的博客 871

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

策略模式是一种设计模式,它允许在运行时动态选择算法的行为。它定义了一系列算法,并将每个算法都封装到了一个独立的类中,这些算法可以相互替换使用。在策略模式中,一个类的行为或算法可以在运行时进行更改,而不必修改它的结构。ConcreteStrategy(具体策略):实现 Strategy 接口,提供具体的算法实现。Context(上下文):持有一个策略对象的引用,并调用策略对象提供的算法。Strategy(策略):定义所有支持的算法的公共接口,并提供具体的实现。2.2 、策略模式实现。

huzhuozhuoas的博客 312

用策略模式和工厂模式代替if else ,让代码更优雅

用策略模式和工厂模式代替if else ,让代码更优雅

善守者 934

如何用工厂模式和策略模式替换繁琐 if-else的场景

一. 用编程解决实际问题的时候,我们常常用if-else去做判断。但实际开发中,if-else 的判断常常会出错,所以,周末的时候就想探究一下如何用工厂模式和策略模式代替繁琐的if -else 场景,从而提高代码的鲁棒性。 public class Main { public static void main(String[] args) { System.out.println("Hello World!"); } public static String i

m0_47912936的博客 402

Java 中如何使用枚举来消除 if/else

枚举是什么意思呐?百度百科的说法是这样的:在数学和计算机科学理论中,一个集的「枚举」 是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。是一个被命名的整型常数的集合。枚举在日常生活中很常见,例如表示星期的SUNDAYMONDAYTUESDAYWEDNESDAYTHURSDAYFRIDAYSATURDAY就是一个枚举。定义枚举类的关键字是 enum, 枚举类对象不能通过 new 出来,里面的SUNDAYMONDAY...

jj1245_的博客 803

如何对项目中的if-else进行优化

首先这个问题我认为是对代码的可扩展性的优化,而不是代码量,因为if之后的逻辑代码是不会减少的。 策略模式 写一个父接口,每个子接口都是一个if的判断,根据构造方法传参,实例的是具体的子接口,其实就是java三大特性之一:多态。 但是有个很明显的问题就是要建很多子类,这么多子类放在一个项目中,不是个好方法。 枚举 类 public enum ItemChoose{ drin...

qq_37754001的博客 444

代码分支多优化(if或者switch)

尽管如此,if_else还是十分友好的,特别是在mcu等产品的开发中,使用设计模式的资源花费简直是奢求,毕竟设计模式是针对高级语言的,大多数情况下if_else往往是最优解。大量使用if_else的前提是项目不需要长期维护,一般情况下还是要多使用设计模式,例如在linux内核中就有源码使用了责任链模式,这是从性能,解耦合性和可读性等多方面考虑,对维护没有要求,而且控制语句的数量较少,为了性能和简便性可以考虑直接使用if_else分支。考虑复杂的业务场景,责任链明显优于传统的if_else。

y330388094的博客 701

Java中多个else_Java中避免过多if-else的几种方法

太多的if-else不太直观,难以维护。以下面代码为例,展示几种替代if else的方法。String input = "three";@Testpublic void testElse() {if ("one".equals(input)) {System.out.println("one");} else if ("two".equals(input)) {System.out.println...

weixin_35489311的博客 913

用枚举彻底干掉if-else链,代码瞬间清爽!

还在为满屏的 if-else 支付分支焦头烂额?每次加个新渠道就得动老代码,改得手抖?别让“面条代码”拖垮你的系统!本文带你用 Java 枚举彻底翻身——它不只是常量容器,更是消灭 if-else 的利器。通过函数式接口绑定行为、结合 Spring 实现策略自动注册,三招搞定支付路由重构。代码从“一坨”变“一张图”,扩展新渠道只需新增类,零修改、零风险。更附错误对比图、流程图解和避坑指南,连 Jackson 序列化都替你想好了。看完你会明白:枚举不是语法糖,是设计思维的觉醒。

m0_72340523的博客 1399

Java中如何替换掉if-else(策略+枚举)

以上便是策略+枚举来解决if-else的方法,这样写代码耦合度变低了,也更加简洁了,扩展性也很强,比如以后有了个星期八(只是举个例子),是不是我们只需要,在枚举中再创建一个实例,就不用改代码了。举个例子吧,比如说每周有7天,我每天都回家做不同的菜,根据入参1-7代表周一到周日,提醒我今天该做什么菜了,那么我们就使用if-else来实现的话,代码是这样的。这样我们就可以根据不同的dayOfWeekValue获取到相应的枚举了,接下来的步骤就是重点了,我们在枚举中定义一个抽象方法,作为做菜的行为。

qq_45004609的博客 2160
上一篇: Java的强大功能和广泛应用使其成为一种非常受欢迎的编程语言
下一篇: Java实现包扫描的工具类示例
普通网友
博客等级 码龄3年 122粉丝 503原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值