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

news2024/11/16 21:48:39

说明

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

在这里插入图片描述

流程图如下

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

代码具体改造

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 {
    @Override
    public boolean isSupport(String payMethod) {
        return "AlipayPay".equals(payMethod);
    }


    @Override
    public void pay(double amount) {
        System.out.println("使用支付宝支付:" + amount + "元。");
    }
}

public class PayPalPaymentStrategy extends AbstractPaymentStrategy {

    @Override
    public boolean isSupport(String payMethod) {
        return "PayPalPay".equals(payMethod);
    }

    @Override
    public void pay(double amount) {
        System.out.println("使用 PayPal 支付:" + amount + "元。");
    }
}


public class UnionPayPaymentStrategy extends AbstractPaymentStrategy {
    @Override
    public boolean isSupport(String payMethod) {
        return "UnionPay".equals(payMethod);
    }

    @Override
    public void pay(double amount) {
        System.out.println("使用银联支付:" + amount + "元。");
    }
}

public class WeChatPaymentStrategy extends AbstractPaymentStrategy {
    @Override
    public boolean isSupport(String payMethod) {
        return "WeChatPay".equals(payMethod);
    }

    @Override
    public 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是否生效。

  @Test
    public 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.coloradmin.cn/o/2088337.html

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

相关文章

接口自动化面试题放送,助你离Offer又近一步

Hi&#xff0c;大家好&#xff0c;网传金九银十&#xff0c;其实只要技术过硬&#xff0c;准备充分&#xff0c;任何时候都是找工作的黄金时期。时值五月&#xff0c;今天继续分享一波接口自动化面试题&#xff0c;为你的面试助攻&#xff0c;欢迎在留言区评论喔。 请问你是如…

大数据-109 Flink 体系结构 运行架构 ResourceManager JobManager 组件关系与原理剖析

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

全新一代理想智能驾驶开启万人体验团招募,OTA 6.2正式全量推送

核心信息&#xff1a; 无图NOA正式推送后&#xff0c;截至7月30日&#xff0c;理想汽车城市NOA日均里程提升3倍&#xff0c;城市NOA日均活跃度提升8倍理想全国门店开启无图NOA试驾后&#xff0c;门店NOA试驾率实现倍增&#xff0c;30万元以上车型AD Max销量占比达到70%理想端到…

NoSQL:数据库领域的“新潮力量”——从起源到未来的全面解析

引言 曾几何时&#xff0c;关系型数据库&#xff08;RDBMS&#xff09;就是数据管理的“老大哥”&#xff0c;一统江湖&#xff0c;所向披靡。然而&#xff0c;随着大数据时代的到来&#xff0c;数据量像火箭般飙升&#xff0c;数据的形态也变得越来越“随性”&#xff0c;传统…

一文盘点:性能测试常见的7大指标(文末送性能测试题库)

01性能指标分类 系统性能指标 资源性能指标 中间件指标 数据库指标 稳定性指标 可扩展性指标 可靠性指标 1、系统性能指标 响应时间 系统处理能力 吞吐量 并发用户数 错误率 2、资源性能指标 CPU 內存 磁盘吞吐量 网络吞吐量 3、中间件指标 常用的中间件例如…

webstorm最新激活码

最智能的 JavaScript IDE WebStorm 是一个适用于 JavaScript 和相关技术的集成开发环境。类似于其他 JetBrains IDE&#xff0c;它也会使您的开发体验更有趣&#xff0c;自动执行常规工作并帮助您轻松处理复杂任务。 激活码获取地址 https://web.52shizhan.cn/activity/webs…

微信小程序用web-view实现内嵌h5页面

需求&#xff1a; 在微信小程序里面使用web-view内嵌一个h5页面&#xff0c;并且从h5页面还可以跳到小程序的某个页面 目录 需求&#xff1a; 小程序web-view内嵌h5页面 配置&#xff1a; code&#xff1a; 在h5页面跳转到小程序的某个页面 嵌入sdk&#xff1a; code&…

servlet的过滤器filter和springmvc的拦截器Interceptor

背景 Servlet的过滤器&#xff08;Filter&#xff09;和Spring MVC的拦截器&#xff08;Interceptor&#xff09;都是用于在请求处理过程中对请求进行拦截和处理的组件。它们之间的主要区别在于它们的作用范围和使用方式。 作用范围 Filter&#xff1a;过滤器是基于Servlet规范…

性价比运动耳机排行榜有哪些上榜?排行榜五大人气机型分享!

开放式蓝牙耳机最近异常火热&#xff0c;不是因为开放式耳机技术含量有多高&#xff0c;而是它从另一个层面&#xff0c;给了很多追求佩戴舒适&#xff0c;又讲究卫生、安全的玩家一种完美的方案。相对于入耳式耳机它又有独特的视听魅力。相比传统入耳式耳机&#xff0c;开放式…

运动耳机哪个牌子的质量好?五款口碑绝佳机型安利!

​现在耳机市场上&#xff0c;开放式耳机因为外观时尚、戴着舒服&#xff0c;成了大家日常爱用的热门货。但是&#xff0c;市面上的开放式耳机品牌多得眼花缭乱&#xff0c;质量也是高低不一&#xff0c;让人挑花了眼。作为一个搞了三年耳机评测的博主&#xff0c;我还是个耳机…

五、工程化开发和脚手架Vue CLI

开发 Vue 的两种方式: 1.核心包传统开发模式:基于 html/css/js 文件&#xff0c;直接引入核心包&#xff0c;开发 Vue. 2.工程化开发模式:基于构建工具(例如:webpack)的环境中开发 Vue。 一、基本介绍&#xff1a; Vue CLl 是 Vue 官方提供的一个可以帮助我们快速创建一个开发…

ISO 26262中的失效率计算:SN 29500-7 Expected values for relays

目录 引言 1 基准条件下的失效率 2 失效率转换 2.1 失效率预测模型 2.2 负载应力系数 2.2.1 应力区域 2.2.2 负载应力系数选择 2.3 环境应力系数 2.4 温度应力系数 2.4.1 温度应力系数计算模型 2.3.2 温度应力系数计算 2.4 失效准则系数 3 任务剖面应力系数 引言 …

使用 nuxi build 命令构建你的 Nuxt 应用程序

title: 使用 nuxi build 命令构建你的 Nuxt 应用程序 date: 2024/8/30 updated: 2024/8/30 author: cmdragon excerpt: nuxi build 命令是构建 Nuxt 应用程序的核心工具,它将你的应用程序打包成适合生产环境的格式。通过理解和使用不同的选项,如 --prerender、–dotenv 和…

【微信小程序】分包--基础概念

基础概念 1. 什么是分包 分包指的是把一个完整的小程序项目&#xff0c;按照需求划分为不同的子包&#xff0c;在构建时打包成不同的分包&#xff0c;用户在使用时按需进行加载。 2. 分包的好处 3. 分包前项目的构成 4. 分包后项目的构成 5. 分包的加载规则 6. 分包的体积限…

#单片机基础 笔记二

SPI中断 1.SPI总线协议 1.1协议介绍 SPI接口是Motorola &#xff08;motorola | Smartphones, Accessories & Smart Home Devices&#xff09;首先提出的全双工三线/四线同步串行外围接口采用主从模式&#xff08;Master Slave&#xff09;架构。 时钟由Master控制&#xf…

Fast-BEV: A Fast and Strong Bird’s-Eye ViewPerception Baseline

本文提出了一种简单但有效的框架&#xff0c;称为Fast-BEV&#xff0c;它能够在车载芯片上进行更快的BEV感知。 Fast-BEV框架包括五个部分: (1) 一个轻量级且易于部署的视图变换方法&#xff0c;能够快速将2D图像特征转化为3D体素空间&#xff1b; (2) 一个多尺度图像编码器…

DAY8:DNS查询过程 | CDN的概念和功能 | Cookie和Session是什么?有什么区别?

目录 DNS查询过程 CDN的概念和功能 Cookie和Session是什么&#xff1f;有什么区别&#xff1f; Cookie和Session的概念 Cookie和Session的区别 DNS查询过程 DNS用来将主机名和域名转换为IP地址&#xff0c;其查询过程一般通过以下步骤&#xff1a; 本地DNS缓存检查&…

岩石检测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

岩石检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

九方智投控股已完成九章证券领域大模型算法备案

九方智投控股已完成九章证券领域大模型算法备案 8月29日九方智投控股&#xff08;股票代码&#xff1a;09636.HK&#xff09;公布其截至2024年6月30日的上半年业绩报告&#xff0c;财报显示&#xff0c;集团总收益达到了约人民币898.1百万元&#xff0c;较去年同期的约人民币86…

[000-01-008].第01节:Consul环境搭建

1.Windows环境搭建环境&#xff1a; 1.1.单机版 a.下载 1.官网说明&#xff1a; b.安装&#xff1a; 1.下载完成后只有一个consul.exe文件&#xff0c;硬盘路径下双击运行&#xff0c;查看版本号信息 c.服务启动&#xff1a; 1.使用开发模式启动&#xff1a;consul ag…