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

说明

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

在这里插入图片描述

流程图如下

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

代码具体改造

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: 无效的参数

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值