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

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

说明

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

在这里插入图片描述

流程图如下

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

代码具体改造

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

相关文章

Nginx错误拦截转发 error_page的问题解决

《Nginx错误拦截转发error_page的问题解决》Nginx通过配置错误页面和请求处理机制,可以在请求失败时展示自定义错误页面,提升用户体验,下面就来介绍一下Nginx错误拦截转发error_... 目录1. 准备自定义错误页面2. 配置 Nginx 错误页面基础配置示例:3. 关键配置说明4. 生效

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

Nginx 访问控制的多种方法

《Nginx访问控制的多种方法》本文系统介绍了Nginx实现Web访问控制的多种方法,包括IP黑白名单、路径/方法/参数控制、HTTP基本认证、防盗链机制、客户端证书校验、限速限流、地理位置控制等基... 目录一、IP 白名单与黑名单1. 允许/拒绝指定IP2. 全局黑名单二、基于路径、方法、参数的访问控制

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

nginx跨域访问配置的几种方法实现

《nginx跨域访问配置的几种方法实现》本文详细介绍了Nginx跨域配置方法,包括基本配置、只允许指定域名、携带Cookie的跨域、动态设置允许的Origin、支持不同路径的跨域控制、静态资源跨域以及... 目录一、基本跨域配置二、只允许指定域名跨域三、完整示例四、配置后重载 nginx五、注意事项六、支持

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直