【设计模式系列】策略模式看这篇就够了 您所在的位置:网站首页 支付方式流程图 【设计模式系列】策略模式看这篇就够了

【设计模式系列】策略模式看这篇就够了

2023-09-22 06:39| 来源: 网络整理| 查看: 265

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

前言

小黑习惯于在讲设计模式时,引入一个具体的业务场景,便于读者能更容易的理解怎么使用。

同样,本期内容先给大家举一个例子,在很多电商网站或者有支付场景的系统中,支持多种支付方式,比如使用银行卡,微信或者支付宝等,那么实际在支付系统内部,不同的支付方式需要请求不同的第三方接口,比如银行卡支付方式需要请求网联,微信支付需要调用微信的API,支付宝则使用支付宝的API。

未使用设计模式

对于上面的场景,如果在没有使用设计模式时,我们的代码一般都是用下面的方式处理。

public class PaymentService { CreditService creditService; WeChatService weChatService; AlipayService alipayService; public void payment(PaymentType paymentType, BigDecimal amount) { if (PaymentType.Credit == paymentType) { creditService.payment(); } else if (PaymentType.WECHAT == paymentType) { weChatService.payment(); } else if (PaymentType.ALIPAY == paymentType) { alipayService.payment(); } else { throw new NotSupportPaymentException("paymentType not support"); } } } enum PaymentType { Credit, WECHAT, ALIPAY; }

这种使用if...else的方式虽然能支持现有的业务需求,但是当业务需求发生改变时,比如增加新的支付方式,或者将某一个支付方式下线,则需要对PaymentService进行修改,显然这种设计不符合开闭原则(对修改关闭,对扩展开放),修改之后需要重新对其他的支付方式进行测试。

弊端: 不符合开闭原则 不能做到自由切换 if...else逻辑复杂,代码结构混乱 扩展性差 。。。

总之,这种方式就是很low,那么接下来我们使用策略模式来进行改造。

策略模式的定义

策略设计模式是一种行为设计模式。当在处理一个业务时,有多种处理方式,并且需要再运行时决定使哪一种具体实现时,就会使用策略模式。

这个定义和我们的例子说的一回事儿,在支付业务中,有三种付款方式,程序运行时使用哪种方式由用户选择,根据用户选择执行不同的逻辑。

策略模式结构

首先,我们需要将支付方式这一行为抽象为一个策略接口,代表支付方式的抽象。

public interface PaymentStrategy { public void payment(BigDecimal amount); }

然后我们再针对需要支持的三种支付方式建立对应的策略实现类。

银行卡支付策略

public class CreditPaymentStrategy implements PaymentStrategy{ @Override public void payment(BigDecimal amount) { System.out.println("使用银行卡支付" + amount); // 去调用网联接口 } }

微信支付策略

public class WechatPaymentStrategy implements PaymentStrategy{ @Override public void payment(BigDecimal amount) { System.out.println("使用微信支付" + amount); // 调用微信支付API } }

支付宝支付策略

public class AlipayPaymentStrategy implements PaymentStrategy { @Override public void payment(BigDecimal amount) { System.out.println("使用支付宝支付" + amount); // 调用支付宝支付API } }

然后重新实现我们的支付服务PaymentService。

public class PaymentService { /** * 将strategy作为参数传递给支付服务 */ public void payment(PaymentStrategy strategy, BigDecimal amount) { strategy.payment(amount); } }

发现了吗?我们将支付策略作为参数传递给支付服务,在支付服务中只需要按照运行时传的支付策略对象进行支付就可以了。

我们来测试一下使用策略模式之后的代码。

public class StrategyTest { public static void main(String[] args) { PaymentService paymentService = new PaymentService(); // 使用微信支付 paymentService.payment(new WechatPaymentStrategy(), new BigDecimal("100")); //使用支付宝支付 paymentService.payment(new AlipayPaymentStrategy(), new BigDecimal("100")); } }

运行结果:

在使用了策略模式之后,在我们的支付服务PaymentService中便不需要写复杂的if...else,如果需要新增加一种支付方式,只需要新增一个新的支付策略实现,这样就满足了开闭原则,并且对其他支付方式的业务逻辑也不会造成影响,扩展性很好。

策略模式类图

按照惯例,我们来看一下策略模式的类图。

JDK中使用策略模式的例子

在JDK中最经典的使用策略模式的例子就是Collections.sort(List list, Comparator



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有