策略模式+模版方法模式+简单工厂模式混用优化代码复杂分支问题

本文主要是介绍策略模式+模版方法模式+简单工厂模式混用优化代码复杂分支问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

说明

这篇博客是在复杂场景使用策略和工厂模式代替分支语句升级版,增加了模版方法模式。将支付类的公共逻辑抽取到模板类中,使整个支付逻辑更加灵活,进一步优化了代码结构,提升了软件的可维护性和可读性。

在这里插入图片描述

流程图如下

先看一遍流程再对一下代码就能很深刻理解了。
在这里插入图片描述

代码具体改造

1、首先新增模版方法

public abstract class AbstractPaymentStrategy implements PaymentStrategy {/*** 模版方法 - 规定方法执行顺序,先check检查参数,再执行pay方法*/public final void commonPay(double amount) {check(amount);pay(amount);}/*** 不希望子类去重写*/private void check(double amount) {if (amount <= 0) {throw new RuntimeException("无效的参数");}}
}

2、策略类由实现PaymentStrategy 接口改为继承模版方法

public class AlipayPaymentStrategy extends AbstractPaymentStrategy {@Overridepublic boolean isSupport(String payMethod) {return "AlipayPay".equals(payMethod);}@Overridepublic void pay(double amount) {System.out.println("使用支付宝支付:" + amount + "元。");}
}public class PayPalPaymentStrategy extends AbstractPaymentStrategy {@Overridepublic boolean isSupport(String payMethod) {return "PayPalPay".equals(payMethod);}@Overridepublic void pay(double amount) {System.out.println("使用 PayPal 支付:" + amount + "元。");}
}public class UnionPayPaymentStrategy extends AbstractPaymentStrategy {@Overridepublic boolean isSupport(String payMethod) {return "UnionPay".equals(payMethod);}@Overridepublic void pay(double amount) {System.out.println("使用银联支付:" + amount + "元。");}
}public class WeChatPaymentStrategy extends AbstractPaymentStrategy {@Overridepublic boolean isSupport(String payMethod) {return "WeChatPay".equals(payMethod);}@Overridepublic void pay(double amount) {System.out.println("使用微信支付:" + amount + "元。");}
}

3、策略工厂返回的策略接口改为返回模版类

    /*** 从注册的策略列表中获取策略*/public AbstractPaymentStrategy getStrategy(String payMethod) {for (AbstractPaymentStrategy paymentStrategy : paymentStrategyList) {if (paymentStrategy.isSupport(payMethod)) {return paymentStrategy;}}new Exception("支付方式不支持");return null;}

4、使用时调用模版方法代理直接调用pay()

  public void strategyPay(double amount, String payMethod) {PaymentFactory paymentFactory = PaymentFactory.getInstance();AbstractPaymentStrategy strategy = paymentFactory.getStrategy(payMethod);strategy.commonPay(amount);}

测试check是否生效。

  @Testpublic void testStrategyPay() {paymentService.strategyPay(100, "AlipayPay");paymentService.strategyPay(100.0, "PayPalPay");paymentService.strategyPay(100.0, "UnionPay");paymentService.strategyPay(0, "WeChatPay");}
使用支付宝支付:100.0元。
使用 PayPal 支付:100.0元。
使用银联支付:100.0元。java.lang.RuntimeException: 无效的参数

结果符合预期。代码改造成功。

这篇关于策略模式+模版方法模式+简单工厂模式混用优化代码复杂分支问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124524

相关文章

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束