• 设计模式-行为性模式:策略模式


    1、策略模式(Strategy)属于设计模式中的行为型模式。

    2、策略模式定义了一组能够用来标识可能行为的类集合。这些行为可以在应用程序中使用,用来实现业务功能。

    下图类图就是策略模式的一种实现:

    场景释义:

    在执行付款的时候可以有很多种付款方式,比如微信、支付宝、华为支付等等。

    每种支付的处理流程可能也不尽相同,这种时候就可以采用策略模式,后续新增支付方式的时候,只需要添加接口实现类。

    优点

    1、在类自身定义了每一个行为,这样就减少了条件判断语句。

    2、使得功能更加容易扩展,在不对调用代码进行修改的情况下,新增类就可以让程序具有新增的行为。

    应用场景

    应用场景:在有多种算法相似的情况下,解决 if...else分支过多的场景,因为其不利于维护和扩展 。

    何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

    如何解决:将这些算法封装成独立的类,任意地替换。

    关键代码:实现同一个接口。

    示例代码

    业务场景:

    1、一个付款单支持多种付款方式。

    2、不同付款方式其内部处理逻辑不同。

    未使用策略模式优化代码

    1. // 未使用【策略模式】执行支付判断和处理
    2. Payment payment = new Payment();
    3. if ("AliPay".equals(payment.getPayMode())) {
    4. System.out.println("【支付宝】支付");
    5. System.out.println("返回支付结果");
    6. } else if ("WeixinPay".equals(payment.getPayMode())) {
    7. System.out.println("【微信】支付");
    8. System.out.println("返回支付结果");
    9. } else if ("HuaweiPay".equals(payment.getPayMode())) {
    10. System.out.println("【华为】支付");
    11. System.out.println("返回支付结果");
    12. } else if ("xxx".equals(payment.getPayMode())) {
    13. System.out.println("【xxx】支付");
    14. System.out.println("返回支付结果");
    15. }

     使用策略模式优化代码

    好处:

    1、去除了之前多个if-else判断分支。

    2、使得功能更加容易扩展。比如新增新的支付方式时,只需要新增接口实现类。

    1. private static List<IPayService> payServices = new ArrayList<>();
    2. static {
    3. payServices.add(new AliPayService());
    4. payServices.add(new WeixinPayService());
    5. payServices.add(new HuaweiPayService());
    6. }
    7. // 使用【策略模式】执行支付判断和处理
    8. Payment payment = new Payment();
    9. for (IPayService payService : payServices) {
    10. if (payService.support(payment)) {
    11. payService.handlePayment(payment);
    12. }
    13. }

    定义支付接口:

    1. /**
    2. * 支付接口定义
    3. *
    4. * @author chenliwu
    5. * @since 2022-06-29
    6. */
    7. public interface IPayService {
    8. /**
    9. * 是否支持支付
    10. *
    11. * @param payment 支付清单
    12. * @return 是否支持支付
    13. */
    14. boolean support(Payment payment);
    15. /**
    16. * 付款
    17. *
    18. * @param payment 支付清单
    19. * @return 付款结果
    20. */
    21. boolean handlePayment(Payment payment);
    22. }

    具体支付实现类:

    1、支付宝支付:

    1. public class AliPayService implements IPayService {
    2. @Override
    3. public boolean support(Payment payment) {
    4. System.out.println("判断是否支持【支付宝】支付");
    5. return false;
    6. }
    7. @Override
    8. public boolean handlePayment(Payment payment) {
    9. System.out.println("【支付宝】支付");
    10. return false;
    11. }
    12. }

    2、微信支付:

    1. /**
    2. * 微信支付实现
    3. *
    4. * @author chenliwu
    5. * @since 2022-06-29
    6. */
    7. public class WeixinPayService implements IPayService {
    8. @Override
    9. public boolean support(Payment payment) {
    10. System.out.println("判断是否支持【微信】支付");
    11. return false;
    12. }
    13. @Override
    14. public boolean handlePayment(Payment payment) {
    15. System.out.println("【微信】支付");
    16. return false;
    17. }
    18. }

    3、华为支付:

    1. /**
    2. * 华为-支付实现
    3. *
    4. * @author chenliwu
    5. * @since 2022-06-29
    6. */
    7. public class HuaweiPayService implements IPayService {
    8. @Override
    9. public boolean support(Payment payment) {
    10. System.out.println("判断是否支持【华为】支付");
    11. return false;
    12. }
    13. @Override
    14. public boolean handlePayment(Payment payment) {
    15. System.out.println("【华为】支付");
    16. return false;
    17. }
    18. }

  • 相关阅读:
    3. 自然语言处理NLP:具体用途(近义词类比词;情感分类;机器翻译)
    845. 数组中的最长山脉
    qt之网络检测
    VMware——WindowServer2012R2环境安装mysql5.7.14解压版_互为主从(图解版)
    数据结构与算法拾遗八(认识复杂度)
    新手如何学习RPA,怎么学,从哪下手,学习资源哪里来?
    记录一次较为完整的服务打包发布流程
    实现 表格 隔行变色 案例
    Redis的缓存更新策略和缓存问题
    git 回退过程记录
  • 原文地址:https://blog.csdn.net/qq_33721382/article/details/125570225