使用策略模式替代 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 阅读详情

相关推荐

使用FileZilla在武汉大学IGS数据分析中心下载GNSS数据

2.依次点击如下图标下载到本地并解压安装(按系统选择要下载的版本)

qq_43381998的博客 6041

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

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

qq_43842093的博客 9399

可微编程:当深度学习遇见物理定律,重塑科学计算新范式

本文探讨了可微编程如何将深度学习与物理定律相结合,重塑科学计算范式。通过自动微分技术,它将物理方程融入可微计算图,使模型在数据驱动的同时遵守物理约束。文章以神经常微分方程为例,阐述了其在连续系统建模、科学模拟器优化等领域的应用,并分析了当前面临的挑战与最佳实践路径。

weixin_29056145的博客 134

巧用Java策略模式取代 if else

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

GodSea_611的博客 1391

从“看不懂Sansen”到亲手搭建:一个Class AB输出级+浮动电压源的保姆级设计复盘

本文详细记录了从理论困惑到实践突破的Class AB输出级与浮动电压源设计全过程。通过电流镜调试、恒定跨导优化及版图匹配等关键步骤,作者实现了高性能运放设计,并分享了从仿真到实测的宝贵经验,为模拟电路初学者提供实用指导。

weixin_33737774的博客 866

28_Spring AI 干货笔记之 OpenAI 聊天功能

本文详细介绍了在Spring AI框架中集成OpenAI聊天模型的方法。内容涵盖API密钥配置、通过starter依赖启用自动配置、连接与模型参数的详细设置,并重点说明了运行时选项的动态覆盖机制。文章还深入讲解了多模态处理(图像与音频)、结构化输出、函数调用等高级功能,提供了示例控制器和手动配置指南,并讨论了与OpenAI兼容服务器的适配与推理模型思维链的获取。

在科技的浪潮中,我们寻找着创新的火种,在代码的海洋里,我们编织着智慧的网。腾飞开源,就是这样一个由技术精英汇聚而成的博客平台,我们致力于分享在Java、Python、IoT和人工智能等领域的最新研究成果和实战经验。 在腾飞开源的博客上,你会看到紧跟技术前 1656

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

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

m0_51014049的博客 967

WinCC 7.5 读取 SQL server2016 中的表格数据

环境 win10 SQL Server 2016 WinCC V7.5 SP2 1 安装SQL Server 2016 2 选择服务器名称 .\WINCC 3 建数据库

skr? 7140

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

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

weixin_34238633的博客 474

嵌入式开发环境Vscode开发STM32单片机程序

STM32单片机非常强大,大多数教程都是使用 keil 编译器,keil 是收费的而 gcc 是开源免费的。这里介绍一些使用 gcc +开发单片机程序的经验。(这里不解释 gcc 是什么)。

嵌入式技术开发 1843

车载以太网-TC8测试

TC8测试的用例数量 TC8测试基本流程 TC8测试内容

天赐好车的博客 3618

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

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

weixin_43955583的博客 4323

Python爬虫实战:高效爬取Vimeo高清视频

在当今数字化时代,视频内容已成为互联网的重要组成部分。Vimeo作为一个高质量的视频分享平台,拥有大量优质视频资源。然而,Vimeo并未提供直接下载视频的选项,因此,我们需要借助Python爬虫技术来获取这些高清视频。(HTTP Live Streaming)格式存储。Vimeo的视频通常不会直接暴露。Vimeo的视频通常以。

2201_76125261的博客 430

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

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

weixin_45734302的博客 290

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

公众号-老炮说Java 431

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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、付费专栏及课程。

余额充值