当前位置: 首页 > article >正文

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

说明

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

在这里插入图片描述

流程图如下

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

代码具体改造

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.kler.cn/news/285298.html

相关文章:

  • 【软件测试】bug以及测试用例的设计方法
  • Taro 微信小程序 分页上拉加载
  • C语言程序设计(初识C语言后部分)
  • Java—可变参数、不可变集合
  • 单链表应用
  • 在Jtti服务器上怎么安装和配置Docker?
  • Pandas 绘图的强大之处:后端
  • Vue面试常见知识总结2——spa、vue按需加载、mvc与mvvm、vue的生命周期、Vue2与Vue3区别
  • 鸿蒙OS试题(6)
  • 自动驾驶---什么是Frenet坐标系?
  • AI学习指南深度学习篇-门控循环单元中的门控机制
  • jenkins发送html邮件配置步骤与注意事项?
  • 25. 蓝牙 - BLE相关2
  • 通过 Docker 部署 WordPress 服务器
  • IO进程day04(进程)
  • 文件上传漏洞详解
  • 存储 IO 性能优化策略、方案与瓶颈分析
  • Python 的http.server库详细介绍
  • Codeforces Round 967 (Div. 2)(A,B,C,D)
  • 使用pgrs在wsl中为postgres写拓展
  • HTTP/1和HTTP/2
  • Java面试前言
  • 【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则
  • 腾讯开源突破技术:V-Express引领人像照片视频化新潮流
  • 数学建模强化宝典(3)fminsearch
  • C++笔记9•list•
  • 使用 Nginx 部署前端 Vue 项目
  • Excel下拉框多选
  • MIT的10门免费线上课,YYDS!
  • 算法day17|如何求普通二叉树的众数