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

策略模式的定义

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

策略模式的类图:

策略模式的实现

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

  1. 首先,我们需要将支付方式这一行为抽象为一个策略接口,代表支付方式的抽象。
java 复制代码
public interface PaymentStrategy {

    public void payment(BigDecimal amount);
    
}
  1. 然后我们再针对需要支持的三种支付方式建立对应的策略实现类。

银行卡支付策略

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

微信支付策略

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

支付宝支付策略

java 复制代码
public class AlipayPaymentStrategy implements PaymentStrategy {
    @Override
    public void payment(BigDecimal amount) {
        System.out.println("使用支付宝支付" + amount);
        // 调用支付宝支付API
    }
}
  1. 然后重新实现我们的支付服务PaymentService。
java 复制代码
public class PaymentService {
    
    /**
    * 将strategy作为参数传递给支付服务
    */
    public void payment(PaymentStrategy strategy, BigDecimal amount) {
        strategy.payment(amount);
    }
}

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

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

java 复制代码
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<T> list, Comparator<? super T> c)方法,这个方法接受一个比较器Compartor参数,客户端在运行时可以传入一个比较器的实现,sort()方法中根据不同实现,按照不同的方式进行排序。

总结:

  • 如果在一个系统里面有许多类,它们仅仅在行为上有区别,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为;
  • 一个系统需要动态地在几种算法中选择一种;
  • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
相关推荐
布吉岛的石头27 分钟前
Java 程序员第 45 阶段11:网关统一路由大模型接口,配合 Nacos 配置治理,灰度路由:基于Nacos元数据实现大模型服务灰度发布与权重路由
java·服务发现
我命由我123451 小时前
Android 开发问题:Cannot resolve method ‘repeat‘ in ‘String‘
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
baozhengw1 小时前
信创改造-SpringBootJar包改为WAR包部署Tomcat
java·tomcat
M1A12 小时前
基于 Spring AOP 构建系统操作日志:从注解设计到异步落库的完整实战
java
RainCity2 小时前
Java Swing 自定义组件库分享(十五)
java·笔记·后端
farerboy2 小时前
23-Java 构造函数
java·后端
坚持的小马2 小时前
Rocketmq搭建操作步骤
java·rocketmq·java-rocketmq
砚底藏山河2 小时前
多家股票数据接口对比、企业级股票数据API
java·python·金融·maven
VX_bysjlw9853 小时前
基于微信小程序的宠物用品商城系统-后端74346-计算机毕设原创(免费领源码+带部署教程)
java·redis·微信小程序·eclipse·mybatis·idea·微信开发者工具
JAVA面经实录9173 小时前
图解23种设计模式完整知识体系(Java后端面试完整版)
java·架构