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

在Java中,通常情况下 if-else 语句用于根据不同条件执行不同的逻辑。而策略模式则是一种设计模式,它允许在运行时选择算法的行为。

策略模式的主要思想是将算法封装成独立的对象,使得它们可以相互替换,使得算法的变化独立于使用算法的客户。这种模式可以帮助我们避免使用大量的
if-else 或者 switch-case 结构,从而增强代码的灵活性和可维护性。

使用策略模式替代 if-else

假设我们有一个根据不同类型的用户给予不同折扣的需求。通常的实现可能会使用 if-else 结构来根据用户类型执行不同的逻辑,例如:

java
public class DiscountCalculator {public double calculateDiscount(User user, double purchaseAmount) {if (user.getType().equals(UserType.REGULAR)) {return purchaseAmount * 0.1; // 10% discount for regular users} else if (user.getType().equals(UserType.PREMIUM)) {return purchaseAmount * 0.2; // 20% discount for premium users} else if (user.getType().equals(UserType.GUEST)) {return 0; // no discount for guest users}return 0;}
}

这种方式虽然简单,但是随着用户类型的增加或者逻辑的变更,可能会导致 if-else 结构的增加和修改,不利于代码的扩展和维护。

使用策略模式重构
下面是如何使用策略模式重构上述例子:

定义策略接口:

public interface DiscountStrategy {double applyDiscount(double purchaseAmount);
}

实现具体的策略类:
java

public class RegularDiscountStrategy implements DiscountStrategy {@Overridepublic double applyDiscount(double purchaseAmount) {return purchaseAmount * 0.1; // 10% discount for regular users}
}public class PremiumDiscountStrategy implements DiscountStrategy {@Overridepublic double applyDiscount(double purchaseAmount) {return purchaseAmount * 0.2; // 20% discount for premium users}
}public class GuestDiscountStrategy implements DiscountStrategy {@Overridepublic double applyDiscount(double purchaseAmount) {return 0; // no discount for guest users}
}

使用策略模式:
java

public class DiscountCalculator {private DiscountStrategy discountStrategy;public DiscountCalculator(DiscountStrategy discountStrategy) {this.discountStrategy = discountStrategy;}public void setDiscountStrategy(DiscountStrategy discountStrategy) {this.discountStrategy = discountStrategy;}public double calculateDiscount(double purchaseAmount) {return discountStrategy.applyDiscount(purchaseAmount);}
}

客户端使用:
java

public class Main {public static void main(String[] args) {User user = new User(UserType.REGULAR); // or UserType.PREMIUM, UserType.GUESTDiscountCalculator calculator = new DiscountCalculator(new RegularDiscountStrategy());double discount = calculator.calculateDiscount(100.0);System.out.println("Discount applied: " + discount);}
}

优势和总结

通过策略模式,我们将不同的算法(即折扣计算逻辑)封装到独立的策略类中,客户端根据需要选择具体的策略对象。这种方式避免了大量的 if-else
结构,使得代码更加清晰、扩展性更好,同时也符合面向对象设计的开闭原则(对扩展开放,对修改关闭)。

策略模式适用于那些需要在运行时根据不同情况选择不同算法的场景,是一种常见的行为型设计模式,在Java中也有广泛的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模型情景制作-制作一棵树

情景模型中,最常用到的也是最能提升情景中生气的就是树。然而,自然的生长和环境的影响使得树的制作变成了考验制作者观察力的一道考题。制作一棵逼真的树,我们可以参考下面的这种方法。 铁丝制树 您需要准备9—12根铁丝,每根的长…

SuperCopy解决文档不能复制问题

有一些文档,我们要使用时,总是面临收费的情况,让我们不能复制,让人头疼不已!!! SuperCopy就可以解决这个问题。 获取SuperCopy步骤 1. 打开浏览器,点击右上角的三个点 2. 找到扩…

老板电器 45 年的烹饪经验,浓缩在这款烹饪大模型中

在科技不断进步的时代,人工智能(AI)迅速成为推动各行各业发展的重要力量。家电行业也不例外,根据 Gartner 的报告预测,到 2024 年,AI 家电市场的规模将达到万亿美元级别。这一预估凸显了智能化在家电行业中…

网络安全 DVWA通关指南 Cross Site Request Forgery (CSRF)

DVWA Cross Site Request Forgery (CSRF) 文章目录 DVWA Cross Site Request Forgery (CSRF)DVWA Low 级别 CSRFDVWA Medium 级别 CSRFDVWA High 级别 CSRFDVWA Impossible 级别 CSRF CSRF是跨站请求伪造攻击,由客户端发起,是由于没有在执行关键操作时&a…

selenium网页自动化使用教程

Selenium 是一个流行的自动化测试工具,它支持多种编程语言,包括 Python。以下是关于 Selenium 安装和使用的一些详细步骤: 安装 Selenium: 确保 Python 环境已经安装在你的计算机上。Selenium 支持 Python 2.7 以及 Python 3.2 …

【黑龙江哪些行业需要做等保?】

黑龙江等保测评是衡量企业网络安全水平的一项主要指标,包括:金融,能源,电信,医疗,教育,交通,制造,电商等。 等保测评是黑龙江省信息化建设的重要组成部分,也…

旅游管理系统源码小程序

便捷旅行,尽在掌握 旅游管理系统是一款基于FastAdminElementUNIAPP开发的多端(微信小程序、公众号、H5)旅游管理系统,拥有丰富的装修组件、多端分享、模板消息、电子合同、旅游攻略、旅游线路及相关保险预订等功能,提…

Code Page 历史

1. Code Page 历史发展 此技术的使用最早追溯到 MS-DOS3.3(1987 年 4 月发行)向 IBMPC 用户引进了内码表的概念,Windows 也使用此概念。 最初的 IBM 字元集被称作内码表 437,或者(MS-DOSLatinUS)。内码表…

1961 Springboot自习室预约系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 自习室预约管理系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整的源代码和数据库…

大型企业组网如何规划网络

大型企业组网是一个复杂的过程,它需要细致的规划和设计,以确保网络能够满足企业的业务需求,同时保证性能、安全性和可扩展性。以下是规划大型企业网络的一些关键步骤和考虑因素: 1. 需求分析 业务需求:与各个业务部门…

EWM学习之旅-1-EWM100

系统学习一个业务模块已经变得越来越重要,开始吧,EWM! EWM的Learning Journey中包括7本 ebook,100/110/115/120/125/130/140,一本一本的啃吧,相信很多内容是重复的。 EWM100很适合初学者,了解概念术语&…

Lesson 40 What are you going to do?

Lesson 40 What are you going to do? 词汇 show v. 展示,展出 搭配:show人东西    show东西to人 口语:Show me your hands! 拿出来! n. 秀,表演 搭配:talk show 脱口秀    show room 展厅 take v…

高级同步机制:Phaser与CountDownLatch详解

在Java并发编程中,同步机制是确保多线程环境下数据一致性和程序正确性的关键。Java提供了多种同步工具,其中Phaser和CountDownLatch是两个强大的工具,它们可以帮助我们更好地控制线程的执行顺序和同步。 1. CountDownLatch CountDownLatch是…

BPF:BCC工具 funccount 统计内核函数调用(内核函数、跟踪点USDT探针)认知

写在前面 博文内容涉及BCC工具 funccount 认知funccount 可以帮助用户追踪和分析Linux系统上特定函数、系统探针或USDT探针的运行次数。这对于性能分析、故障排查和系统优化等场景非常有用。理解不足小伙伴帮忙指正 😃,生活加油 不必太纠结于当下,也不必…

byte[]、MultipartFile、File转换

需求背景 当你需要将byte[]、MultipartFile、File实现互转时,无外乎以下场景: 保存第三方接口返回二进制流 前/后端文件流上传 微服务间调用 文件格式转换 byte[]转MultipartFile 错误示例-MockMultipartFile 首先来看一下摘自Spring官网对MockM…

精益生产推进时如何营造持续变革的氛围?

在快速变化的市场环境中,企业如何保持竞争力?精益生产无疑为众多企业提供了一个强大的战略工具。但是,单纯的引入精益生产理念和方法并不能保证企业的持续成功。关键在于如何营造一种持续变革的氛围,让精益生产成为推动企业不断前…

SDN控制器有哪些推荐品牌?

SDN控制器是SDN架构中的核心组件,负责管理网络设备并实现网络策略。随着SDN技术的不断发展,市场上出现了多种SDN控制器,它们来自不同的供应商,各有特色。以下是一些知名的SDN控制器品牌和产品: 1. **OpenDaylight**&a…

智慧校园-宿舍管理系统总体概述

在教育信息化的不断推动下,智慧校园宿舍管理系统脱颖而出,它以一种全新的视角和方式,重塑了高校宿舍管理的传统模式。该系统深度融合了云计算、物联网、大数据等先进科技,旨在为学生提供一个既安全可靠又充满便捷与温馨的居住体验…

Node.js全栈指南:认识MIME和HTTP

MIME,全称 “多用途互联网邮件扩展类型”。 这名称相当学术,用人话来说就是: 我们浏览一个网页的时候,之所以能看到 html 文件展示成网页,图片可以正常显示,css 样式能正常影响网页效果,js 脚…

Arduino - 电磁锁

Arduino - Electromagnetic Lock Arduino - 电磁锁 The electromagnetic lock (EM lock) is widely used to lock the door. It is usually used with switch, fingerprint reader, RFID/NFC reader, keypad, or application on PC/mobille to control access to door, buid…