Java设计模式之策略模式案例详解

 更新时间:2022年07月26日 16:01:03   作者:kaico2018  
策略模式(Strategy Pattern)定义了一组同类型的算法,在不同的类中封装起来,每种算法可以根据当前场景相互替换,从而使算法的变化独立于使用它们的客户端即算法的调用者

为什么使用策略模式?

答:策略模式是解决过多if-else (或者switch-case)代码块的方法之一,提高代码的可维护性、可扩展性和可读性。

优缺点

优点

  • 算法可以自由切换(高层屏蔽算法,角色自由切换)。
  • 避免使用多重条件判断(如果算法过多就会出现很多种相同的判断,很难维护)
  • 扩展性好(可自由添加取消算法而不影响整个功能)。

缺点

策略类数量增多(每一个策略类复用性很小,如果需要增加算法,就只能新增类)。所有的策略类都需要对外暴露(使用的人必须了解使用策略,这个就需要其它模式来补充,比如工厂模式、代理模式)。

Spring中哪里使用策略模式

ClassPathXmlApplicationContext Spring 底层Resource接口采用策略模式

Spring 为Resource 接口提供了如下实现类:

  • UrlResource:访问网络资源的实现类。
  • ClassPathResource:访问类加载路径里资源的实现类。
  • FileSystemResource:访问文件系统里资源的实现类。
  • ServletContextResource:访问相对于ServletContext 路径里的资源的实现类
  • InputStreamResource:访问输入流资源的实现类。
  • ByteArrayResource:访问字节数组资源的实现类。

策略模式设计图

  • Strategy::策略接口或者策略抽象类,并且策略执行的接口
  • ConcreateStrategyA、 B、C等:实现策略接口的具体策略类
  • Context::上下文类,持有具体策略类的实例,并负责调用相关的算法

代码案例

统一支付接口

public interface Payment {
    /**
     * 获取支付方式
     *
     * @return 响应,支付方式
     */
    String getPayType();
    /**
     * 支付调用
     *
     * @param order 订单信息
     * @return 响应,支付结果
     */
    String pay(String order);
}

各种支付方式(策略)

@Component
public class AlipayPayment implements Payment {
    @Override
    public String getPayType() {
        return "alipay";
    }
    @Override
    public String pay(String order) {
        //调用阿里支付
        System.out.println("调用阿里支付");
        return "success";
    }
}
@Component
public class BankCardPayment implements Payment {
    @Override
    public String getPayType() {
        return "bankCard";
    }
    @Override
    public String pay(String order) {
        //调用微信支付
        System.out.println("调用银行卡支付");
        return "success";
    }
}
@Component
public class WxPayment implements Payment {
    @Override
    public String getPayType() {
        return "weixin";
    }
    @Override
    public String pay(String order) {
        //调用微信支付
        System.out.println("调用微信支付");
        return "success";
    }
}

使用工厂模式来创建策略

public class PaymentFactory {
    private static final Map<String, Payment> payStrategies = new HashMap<>();
    static {
        payStrategies.put("weixin", new WxPayment());
        payStrategies.put("alipay", new AlipayPayment());
        payStrategies.put("bankCard", new BankCardPayment());
    }
    public static Payment getPayment(String payType) {
        if (payType == null) {
            throw new IllegalArgumentException("pay type is empty.");
        }
        if (!payStrategies.containsKey(payType)) {
            throw new IllegalArgumentException("pay type not supported.");
        }
        return payStrategies.get(payType);
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        String payType = "weixin";
        Payment payment = PaymentFactory.getPayment(payType);
        String pay = payment.pay("");
        System.out.println(pay);
    }
}

到此这篇关于Java设计模式之策略模式详解的文章就介绍到这了,更多相关Java策略模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java8新特性之Optional使用详解

    Java8新特性之Optional使用详解

    这篇文章主要介绍了Java8新特性之Optional使用详解,为了解决空指针异常更加优雅,Java8 提供了 Optional 类库,Optional 实际上是个容器,它可以保存类型T的值,或者仅仅保存null,,需要的朋友可以参考下
    2023-08-08
  • Java的Collection集合的常用方法详解

    Java的Collection集合的常用方法详解

    这篇文章主要为大家详细介绍了Java的Collection集合的常用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Java数据脱敏常用方法(3种)

    Java数据脱敏常用方法(3种)

    数据脱敏常用在电话号码和身份证号,本文主要介绍了Java数据脱敏常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • java中thread线程start和run的区别

    java中thread线程start和run的区别

    这篇文章主要介绍了java中thread线程start和run的区别,run()是Runnable接口中定义的一个方法,是为了让客户程序员在这个方法里写自己的功能代码的。直接调用和普通的类调用自己的成员方法是没有任何区别的
    2014-03-03
  • Java中的Kafka为什么性能这么快及4大核心详析

    Java中的Kafka为什么性能这么快及4大核心详析

    这篇文章主要介绍了Java中的Kafka为什么性能这么快及4大核心详析,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 详解Spring AOP 实现“切面式”valid校验

    详解Spring AOP 实现“切面式”valid校验

    本篇文章主要介绍了详解Spring AOP 实现“切面式”valid校验,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 快速了解JAVA中的Random()函数

    快速了解JAVA中的Random()函数

    这篇文章主要介绍了JAVA中的Random()函数的使用方法,文中代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Java字节缓冲流原理与用法详解

    Java字节缓冲流原理与用法详解

    这篇文章主要介绍了Java字节缓冲流原理与用法,结合实例形式总结分析了java字节流与缓冲区相关原理与操作技巧,需要的朋友可以参考下
    2019-09-09
  • MyBatis中insert操作返回主键的实现方法

    MyBatis中insert操作返回主键的实现方法

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数。这篇文章主要介绍了MyBatis中insert操作返回主键的方法,需要的朋友可以参考下
    2016-09-09
  • SpringBoot实现文件下载的限速功能

    SpringBoot实现文件下载的限速功能

    在SpringBoot项目中,实现文件下载的限速功能可以有效控制服务器带宽的占用,并防止单个用户消耗过多的资源,本文将通过具体的代码示例和详细的流程解释,介绍如何在SpringBoot项目中实现文件下载的限速功能,需要的朋友可以参考下
    2024-07-07

最新评论