• java设计模式---策略模式


    策略模式的定义

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

    策略模式的类图:
    在这里插入图片描述

    策略模式的实现

    在支付业务中,有三种付款方式,程序运行时使用哪种方式由用户选择,根据用户选择执行不同的逻辑。

    1. 首先,我们需要将支付方式这一行为抽象为一个策略接口,代表支付方式的抽象。
    public interface PaymentStrategy {
    
        public void payment(BigDecimal amount);
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 然后我们再针对需要支持的三种支付方式建立对应的策略实现类。

    银行卡支付策略

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

    微信支付策略

    public class WechatPaymentStrategy implements PaymentStrategy{
        @Override
        public void payment(BigDecimal amount) {
            System.out.println("使用微信支付" + amount);
            // 调用微信支付API
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    支付宝支付策略

    public class AlipayPaymentStrategy implements PaymentStrategy {
        @Override
        public void payment(BigDecimal amount) {
            System.out.println("使用支付宝支付" + amount);
            // 调用支付宝支付API
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 然后重新实现我们的支付服务PaymentService。
    public class PaymentService {
        
        /**
        * 将strategy作为参数传递给支付服务
        */
        public void payment(PaymentStrategy strategy, BigDecimal amount) {
            strategy.payment(amount);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

    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"));
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行结果:

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

    JDK中使用策略模式的例子

    在JDK中最经典的使用策略模式的例子就是Collections.sort(List list, Comparator c)方法,这个方法接受一个比较器Compartor参数,客户端在运行时可以传入一个比较器的实现,sort()方法中根据不同实现,按照不同的方式进行排序。

    总结:

    • 如果在一个系统里面有许多类,它们仅仅在行为上有区别,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为;
    • 一个系统需要动态地在几种算法中选择一种;
    • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
  • 相关阅读:
    java毕业设计在线毕设选题系统Mybatis+系统+数据库+调试部署
    【Verilog练习】多路选择器、译码器、半加器、全加器、寄存器(D触发器)、锁存器(Latch)
    hologres按照联合主键删除子查询中的内容,不用in
    含文档+PPT+源码等]精品微信小程序旅游服务平台+后台管理系统|前后分离VUE[包运行成功]微信小程序项目源码Java毕业设计
    Android三种数据存储的方式
    Python3-excel文档操作(六):利用openpyxl库处理excel表格:Excel可视化,折线图
    数据结构(C语言)——单链表
    Zabbix监控系统与部署Zabbix5.0监控(系列操作完整版)
    QML + KDDockWidget 实现 tabwidget效果( 窗口可独立浮动和缩放)
    Variable (mathematics)
  • 原文地址:https://blog.csdn.net/qq_53844452/article/details/132603840