替代 if else ---策略模式

C#使用策略模式或者委托替代多IfElse判断和Switch语句   使用策略模式或者委托替代多IfElse判断和Switch语句。 阅读详情

什么是策略模式?

比如说对象的某个行为,在不同场景中有不同的实现方式,这样就可以将这些实现方式定义成一组策略,每个实现类对应一个策略,在不同的场景就使用不同的实现类,并且可以自由切换策略。

策略模式结构图如下:

在这里插入图片描述

策略模式需要一个策略接口,不同的策略实现不同的实现类,在具体业务环境中仅持有该策略接口,根据不同的场景使用不同的实现类即可。

面向接口编程,而不是面向实现。

策略模式的优点

1、干掉繁琐的 if、switch 判断逻辑;

2、代码优雅、可复用、可读性好;

3、符合开闭原则,扩展性好、便于维护;

策略模式的缺点:

1、策略如果很多的话,会造成策略类膨胀;

2、使用者必须清楚所有的策略类及其用途;

策略模式实战

举个实际的例子,某个下单选择支付方式场景,用户下单之后,跳转支付页面,此时有多种支付方式和支付产品可选。比如:使用信用卡支付和本地支付,而本地支付又分为支付宝支付,微信支付,云闪付支付等,甚至还有一些第三方支付,如果使用普通的if else写法,那这一块的代码将会非常复杂,并且后期增加了新的支付方式后,也不好维护。所以这里采用java的23种设计模式之一的策略模式来解决这个问题。

传统的 if/ else/ switch 等判断写法比较简单,这里就不贴代码了,直接看策略模式

1.定义策略接口

定义一个策略接口,所有支付方式的接口。

策略接口

/**
 * @author fei
 * @version 1.0
 * @title 支付接口
 * @date 2021/5/17 17:59
 * @Description:
 */
public interface IPayment {
    /**
     * 支付
     * @param order
     * @return PayResult
     */
    PayResult pay(Order order);
}

订单信息类

/**
 * 订单信息
 * @author fei
 */
@Data
public class Order {

    /**
     * 金额
     */
    private int amount;

    /**
     * 支付类型
     */
    private String paymentType;

}
返回结果类

/**
 * 支付返回结果类
 * @author fei
 */
@Data
@AllArgsConstructor
public class PayResult {

    /**
     * 支付结果
     */
    private String result;

}

2.定义各种策略

定义各种支付策略,微信支付、支付宝、云闪付等支付实现类都实现这个接口。

微信支付实现


/**
 * 微信支付实现
 * @author fei
 */
@Service("WechatPay")
public class WechatPay implements IPayment {

    @Override
    public PayResult pay(Order order) {
        return new PayResult("微信支付成功");
    }

}
支付宝实现
/**
 * 支付宝支付
 * @author fei
 */
@Service("Alipay")
public class Alipay implements IPayment {

    @Override
    public PayResult pay(Order order) {
        return new PayResult("支付宝支付成功");
    }

}
云闪付实现
/**
 * 银联云闪付
 * @author fei
 */
@Service("UnionPay")
public class UnionPay implements IPayment {

    @Override
    public PayResult pay(Order order) {
        return new PayResult("云闪付支付成功");
    }

}

这里我把所有支付方式类都用 @Service 注解生成 Bean 放入 Spring Bean 容器中了,在使用策略的时候就不用 new 支付对象了,可以直接使用 Bean,这样更贴近业务。

3.使用策略

也可以使用枚举、HashMap 的方式来根据策略名称映射策略实现类 ,这样是没有问题,但在使用了 Spring 框架的项目还是有点多此一举,完全可以发挥 Spring 框架的优势,使用 Bean 名称就能找到对应的策略实现类了。

参考示例代码如下:


/**
 * 支付服务
 * @author fei
 */
@RestController
public class PayController {

    @Autowired
    private ApplicationContext applicationContext;

    /**
     * 支付接口
     * @param amount
     * @param paymentType
     * @return
     */
    @ApiOperation("测试策略模式支付方式选择")
    @RequestMapping("/pay")
    public PayResult pay(@RequestParam("amount") int amount,
                         @RequestParam("paymentType") String paymentType) {
        Order order = new Order();
        order.setAmount(amount);
        order.setPaymentType(paymentType);

        // 根据支付类型获取对应的策略 bean
        IPayment payment = applicationContext.getBean(order.getPaymentType(), IPayment.class);

        // 开始支付
        PayResult payResult = payment.pay(order);
        return payResult;
    }

}
测试一下:

http://localhost:8082/pay?amount=8800&paymentType=Alipay

在这里插入图片描述

在这里插入图片描述

测试 OK,传入不同的支付方式会调用不同的策略。

设计模式(21) 状态模式 状态模式允许一个对象在其内部状态改变时改变它的行为。用电梯来举例,电梯可以认为具有开门、关门、运行、停止四种状态,这四种状态之间的切换具有多种限制,比如在开门状态下不电梯不能运行,只能转为关门状态;在运行状态下,电梯只能转为停止状态… 设想一下,如果要常规的if-else或者switch-case描述电梯的这几种状态间的切换,将生成非常复杂的、逻辑相互交织的代码,可读性差且不易维护。 而如果用状态模式来实现,会是怎样的呢? 首先创建LiftState,代表抽象的电梯状态,包含了电梯的四个动作(方法),通过这 阅读详情

相关推荐

通达信短周期指标盘中实时监控与预警选股实战

本文详细介绍了通达信短周期指标在盘中实时监控与预警选股中的实战应用。通过分时指标改造、多股同列监控技巧及预警策略优化,帮助短线交易者捕捉转瞬即逝的交易机会,提升选股效率与准确性。重点解析了如何避免假信号干扰及系统卡顿问题,并探讨了从预警到自动交易的进阶应用。

weixin_29230805的博客 888

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

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

qq_43842093的博客 9398

均值场博弈_平均场博弈(mean field game)

The New Big Fish Called Mean-Field Game Theory原文链接http://www.science4all.org/article/mean-field-games/​www.science4all.org主要内容在经典博弈论中,它对附近其他鱼类的行为做出反应。这是非常复杂的,因为不同的鱼类之间会有大量的相互作用。这意味着经典博弈论对应于一长串高度耦合的方程。...

weixin_34773479的博客 3679

使用策略模式代替繁琐的if else

前言 这两天在知乎上看到一篇文章名叫《一个程序员的水平能差到什么程度?》这上面写的代码确实让看的人当做饭后笑话的谈资,让下一个接盘的人又磨刀霍霍向猪羊的冲动 里面大部分的吐槽都是针对于if else 无作为的使用以及滥用的吐槽,if …else if … else…这确实是我们在各种项目研发中的一个利器,但是一旦他过于多,就会使逻辑混乱,让代码的可读性大大下降,并且我发现在我以前写的项目中也存在...

qq1037893644的博客 8583

手把手教你用FPGA实现SerDes高速接口设计(附避坑指南)

本文是一份详尽的FPGA SerDes高速接口设计实战指南。文章深入剖析了SerDes硬核(如GTX/GTH)的时钟管理、发送端均衡、接收端CDR与均衡等核心模块,并提供了Verilog代码示例。重点分享了信号完整性分析、眼图调试与误码率测试等实战经验,附有自定义高速视频流接口的完整实现案例与避坑指南,帮助工程师从“会用”到“懂”且能独立驾驭高速接口设计。

ik678901234的博客 1144

基于STM32L4XX、HAL库的DP83822 以太网收发器(PHY)驱动程序设计

一、简介:DP83822是德州仪器(TI)推出的一款低功耗、高性能10/100Mbps以太网物理层收发器(PHY)。它具有以下主要特性:支持10BASE-T和100BASE-TX以太网标准低功耗设计,适合嵌入式应用MII/RMII接口,方便与微控制器连接内置自检和诊断功能支持自动协商和手动配置工业级温度范围(-40°C至+85°C)

zhusl6688的博客 525

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

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

秃了也弱了 5044

【思考模型框架】采用双钻模型:发散(桌面研究/用户访谈)→收敛(需求归类/优先级排序),输出需求规格书、追踪矩阵及产品待办清单。

设计思维双钻模型是一种以用户为中心的需求管理方法,通过"发散-收敛"的双循环确保问题定位准确、方案切实可行。第一钻石(探索→定义)聚焦"找对问题",运用用户访谈、田野调查等方法挖掘真实需求;第二钻石(开发→交付)解决"做对方案",通过原型测试、A/B测试验证可行性。该模型强调低保真验证、多团队协作和真实用户测试,避免资源浪费与伪需求开发。典型应用场景包括产品功能优化、用户体验提升等需要精准落地的需求场景。核心价值在于建立从用户痛点到解决方案的可控闭

奶爸的编程之路,也就一周冷个三天 316

Springboot中使用策略模式替代If-Else分支

一、项目中常用的if-else分支语句的分析: 1、项目中我们可不可以使用if-else分支,该怎么使用才能使程序最优,维护起来更加的方便?首先项目中可以使用if-else分支,可以使程序通俗易懂。但是面对太多的分支或者逻辑稍微复杂的代码块,if-else分支不免显得优点乏力,在C++中貌似超过200个分支就会编译错误,在实际的交易系统中随着业务的增加,交易数会突破200+这个时候就会带来一些问题;其次,业务逻辑层等比较抽象的地方使用冗长的if else不好;同时,if-else代码违反了 open c.

ustcgdd的博客 1997

灰质-白质组织对比(Gray-white matter tissue contrast,GWC)计算以及可视化

GWC是深层灰质与浅表白质(superficial white matter,SWM)之间T1加权信号强度的比值,已知髓鞘中的胆固醇是T1加权信号强度的主要影响因素,因此GWC大致反映了大脑皮层和浅表白质之间的髓鞘化差异。GWC代表灰白质交界处的模糊程度,较低的GWC表明灰质和白质交界处更相似和更模糊;较高的GWC表明灰白质分界更加清楚。据之前的研究报道,局灶性皮质发育不良、颞叶癫痫、帕金森病、强迫症、精神分裂症和自闭症谱系障碍中存在灰白质交界区GWC异常增高或降低。 灰质信号强度和白质信号强度采集的示意图

xxx 732

【RT-DETR涨点改进】独家Conv改进篇 | 来自TIP 2024顶刊| 引入 DEConv细节增强卷积模块, 能够恢复更多细节信息,提升小目标检测精度、含多种不同模型改进点

本文提出了一种细节增强卷积(DEConv)模块,通过融合多种差异卷积(CDC、ADC、HDC、VDC)来增强图像特征表示能力,特别在边缘和纹理细节提取方面表现突出。该模块采用重参数化技术,在不增加计算成本的情况下,将先验信息融入常规卷积层,显著提升了RT-DETR模型在模糊或遮挡场景下的目标检测精度。实验验证了DEConv在多种骨干网络(ResNet18/50、HGNet等)中的有效性,为实时目标检测系统提供了轻量高效的改进方案。

Ai缝合怪、助力小伙伴高效发论文 449

java策略模式 if else_Java如何利用策略模式替代if/else语句

平时在开发中避免不了使用大量的if else语句,但过多层的if else对于性能有很大的开销,类似如下代码public class MainStart {public static void main(String[] args) {String msgid = "MS066";if(message.equals("MS066")){System.out.println("MS066");}el...

weixin_28694169的博客 421

linux系统中实现智能家居的基本方法

使用QT开发智能家居中的一个物联应用,通过云服务器远程控制设备与设备进行通信。在生活中,可以使用WIFI智能插座控制电器开关,比如远程开启热水器,远程打开空调,窗帘等等。包括:WIFI联网,注册到云服务器上,编写QT UI通过网络来与云服务器通信,然后再下发指令到这个连网的设备。硬件说明:需要有一个串口转WIFI模块,另外需要加上一个USB-TTL模块,外加一根T口USB连接线,可接入PC电脑调试。

嵌入式技术开发 2608

策略模式替代 if else

1. 什么是策略模式? 策略模式其实也是在解耦,把策略的定义、创建、使用这三个部分解耦开来,因为本身策略模式也是基于接口编程,这样其实可以简单的理解客户端调用使用接口进行编程,可以通过工厂方法创建对应的策略模式,进而完成对应的程序功能。这么说起来有点拗口,我们直接看程序吧。 public interface Strategy { void alg(); } public class ConcreteStrategyA implements Strategy { @Override public

妃宫千早 1万+

IMSL CNL 7.0.0 (x86-64)Crack

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

m0_51014049的博客 966

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[设计模式] ------ 策略模式实战:java中替代if-else的大段逻辑

java中用策略模式替代if-else的大段逻辑 问题: java本来是一门以面向对象为主的语言,但很多人嘴上说着java面向对象,然后除了表映射实体之外,其他的还是面向过程的思路。 就比如今天要说的,代码中大段大段的if-else判断,每个if-else代码块中又有很多复杂的逻辑,导致整个代码混乱不堪,让别人看到就感觉看到屎一样的代码一样。 那么,如何优雅的替代这些代码呢,其实有个设计模式(策略...

zhangsir的博客 9327

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

策略模式替代if-else

参考 策略模式使用场景 策略模式的定义 策略模式是应用最普遍的设计模式之一。Gof 把策略模式归类到对象行为型模式,《设计模式:可复用面向对象软件的基础》对策略模式做出了明确的定义:“Define a family of algorithms, encapsulate each one, and make theminterchangeable.Strategy lets th...

qq_36026747的博客 1216

Spring Boot 使用策略模式来替代if else

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、传统方式实现二、策略方式实现1.实现思路2. 代码实现3. 用到的工具类参考文档 前言 这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。 一、传统方式实现 订单实体: public class OrderDTO { private String code; private BigDecimal price; /**

猿起于此 870

JavaScript性能优化实战:策略模式替代多重 if-else

摘要: JavaScript中多重if-else或switch的过度使用会导致代码臃肿、性能下降(如分支预测失败、CPU缓存效率低)。本文提出通过策略模式优化,将条件分支封装为独立策略对象,实现算法动态替换。优势包括: 性能提升:对象属性访问(O(1))替代顺序判断(O(n)),实测执行时间减少47%; 代码质量:增强可维护性、扩展性,符合开闭原则; 灵活应用:通过电商折扣系统等案例,展示如何解耦用户类型、促销活动等策略。

qinzhenyan的博客 995

python 策略模式 减少if else_Java如何利用策略模式替代if/else语句

平时在开发中避免不了使用大量的if else语句,但过多层的if else对于性能有很大的开销,类似如下代码public class MainStart {public static void main(String[] args) {String msgid = "MS066";if(message.equals("MS066")){System.out.println("MS066");}el...

weixin_34832150的博客 2408

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

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

DevNinja的博客 868

策略模式替代if-else繁琐判断

经常在网上看到一些名为“别再if-else走天下了”,“教你干掉if-else”等之类的文章,大部分都会讲到用策略模式去代替if-else。策略模式实现的方式也大同小异。再一个接口多个实现都写好了之后,就是引用的问题了,下面看看如何利用render(String type)方法完成实现类的引用。),并实现不同策略下的处理逻辑(对应实现类)。本文要说的是实现策略模式的一个方法,代替了传统的if-else判断。至此,到这里一个简单的策略模式就算是完成了,简单记录,也希望可以帮到有需要的人。

askuld的博客 546

JAVA代码优化:策略模式+工厂模式替代if-else

摘要:针对银行再保理业务中不同银行认款规则差异导致的代码复杂度问题,采用策略模式进行优化。通过定义统一认款接口及银行类型注解,为每家银行创建独立实现类,利用工厂模式动态匹配处理逻辑。该方法有效消除了if-else嵌套,使系统具备良好扩展性——新增银行只需添加实现类而无需修改核心代码,符合开闭原则。具体实现包括:1)银行类型注解标识不同实现类;2)工厂类维护银行类型与处理类的映射关系;3)业务服务通过工厂获取对应处理器执行认款操作。该设计显著提升了代码可维护性和可读性。

不朽的博客 337
上一篇: 替代if else 的方法---巧用枚举类和抽象方法
下一篇: Spring如何解决循环依赖
意田天
博客等级 码龄7年 41粉丝 89原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

意田天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值