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

相关推荐

别再只盯着MES了!半导体/面板厂CIM系统全家桶(EAP/YMS/SPC)保姆级入门指南

本文深入解析半导体制造中的CIM系统,涵盖EAP、YMS和SPC等关键子系统的协同工作。通过实战案例和技术细节,展示如何利用CIM系统提升生产效率、良率管理和设备维护,为半导体/面板厂提供全面的实施指南和优化策略。

weixin_33693070的博客 464

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

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

qq_43842093的博客 9399

智能车视觉算法实战:十字路口与弯道拐点的精准识别

本文深入探讨了智能车视觉导航中十字路口与弯道拐点的精准识别算法。通过实战经验,详细解析了如何利用纵向巡线法生成边界数组,并从中高效提取“上拐点”与“下拐点”的关键特征。文章重点分享了提升算法鲁棒性的核心技巧,包括图像预处理、ROI设置、状态机应用及多特征融合,旨在帮助开发者实现智能车在复杂路况下从“看见”到“看懂”的稳定决策。

weixin_29061465的博客 633

巧用Java策略模式取代 if else

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

GodSea_611的博客 1391

《活用数据——驱动业务的数分析实战》读书笔记 (实战篇)

第四章、战略分析案例解析         如思维篇所述,分析思路是从研究目的到研究内容的分解过程。因此需要考虑如下两个问题: 战略分析的研究目的 战略分析的研究内容 1、研究目的:战略选择         战略分析的研究目的是帮助企业进行战略选择,选择适合自己的目标市场。需要回答以下两个问题: 市场吸引力:这个市...

Xiaozhu的博客 3698

淘宝链接跳转微信全攻略:自建合规中转页实现私域引流

在跨平台运营中,链接跳转是连接不同生态、实现流量引导的关键技术。其核心原理是通过服务器端或前端逻辑,将用户从一个平台的链接安全引导至目标页面,同时规避平台间的访问限制。这项技术的核心价值在于打破数据孤岛,实现跨平台用户沉淀与精细化运营,广泛应用于电商引流、私域流量构建和跨平台营销等场景。本文聚焦于**淘宝短链**与**企业微信**之间的跳转难题,提供了一套基于自建中转页面的完整工程解决方案,手把手教你如何通过合规的技术手段,将淘宝流量高效、安全地引导至微信生态,并实现数据追踪与客户分流。

weixin_34185512的博客 411

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

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

m0_51014049的博客 967

基于单目视觉的四旋翼定点降落——如何通过mavros控制pixhawk(二)

    一直拖了这么久没有更新,怪我太懒啦~~~ 今天要特别感谢舒仔仔同学,我的好队友帮我写了这篇博文。这篇文章主要讲了如何通过mavros来控制pixhawk。硬件逻辑是这样子,我们先搞一个odroid(土豪上TX2),再用usb线将odroid与pixhawk连接。所以,odroid发送控制指令来控制pixhawk飞行。pixhawk与外界的通信协议是mavlink。ROS下面有个包叫mavr...

zhengyuxin0507的博客 1万+

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

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

weixin_34238633的博客 474

Allegro快速编辑丝印文字操作指导

选择setup-Application Mode-placement edit。Allegro支持丝印文字的编辑,下面介绍快速编辑丝印文字的两种方法如下。这个功能还支持拷贝粘贴,可以从其它地方拷贝过来,免去了书写的麻烦。出现text edit窗口,输入自己需要的文字,点击ok。鼠标移动到丝印文字位置,文字会被高亮起来。Allegro快速编辑丝印文字操作指导。点击丝印文字,丝印会被高亮起来。选择Text edit 命令。输入需要更改后的文字,如下。右击选择text edit。以编辑下方丝印文字为例。

weixin_54787054的博客 4192

第11节:GPU 线程层级:线程、线程块、网格

层级标识变量功能线程threadIdx执行单元,处理数据线程块blockIdx管理多个线程,提供共享内存网格管理多个 blockGPU 编程中,合理安排线程层级,是提升性能的关键。

yumeiguo的博客 211

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

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

weixin_43955583的博客 4323

vue3 - 实现WebRTC播放实时rtsp视频流+NVR录像机回放,web前端浏览器网页播放RTSP推流,支持海康威视大华等摄像头/监控设备对接(监控摄像头录像及回放,拿到rtsp视频流如何处理)

vue3,webrtc-streamer,rtsp视频流,监控画面,nvr录像机,回放功能,监控摄像头设备,vue3播放Rtsp推流示例代码,前端如何在vue3项目中播放rtsp视频流,VUE中播放RTSP实时推流播放解决方案,vue3 webrtc播放rtsp视频流,vue3实现rtsp视频流浏览器实时播放,海康摄像机、NVR、流媒体服务器、回放取流RTSP地址,vue3+vite+ts 使用webrtc-streamer播放海康rtsp监控视频,播放海康rtsp监控视频,海康摄像机/录像机预览+回放RT

✅ 精选推荐文章 1万+

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

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

weixin_45734302的博客 290

STM32F407中文手册

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

公众号-老炮说Java 431

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

余额充值