深入了解Java设计模式之策略模式

 更新时间:2022年09月07日 09:02:22   作者:小小张自由—>张有博  
策略模式属于Java-设计模式中行为模式之一,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。本文将通过示例详细讲解这一模式,需要的可以参考一下

定义

定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

解决的问题

在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

核心要点

把变化的代码从不变的代码中分离出来

针对接口编程而不是具体实现(类)

多用组合/聚合,少用继承

客户端通过组合的方式使用策略

类图

溢出效用

对父类的局部改动,会影响其他部分(子类)、会有溢出效应

策略模式避免使用多重条件语句,比如if-else语句、Swtich语句

缺点:客户端必须知道所有的策略类,并且自行决定使用哪一个策略类。

代码实现

核心接口

/**
 * 策略接口
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:13
 */
public interface Strategy {

    //顶层策略接口
    void Strategy();

}

实现类-三个

/**
 * 策略实现A
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:14
 */
public class ConcreteStrategyA  implements Strategy{

    @Override
    public void Strategy() {
        System.out.println("算法A实现");
    }
}

/**
 * 策略实现B
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:14
 */
public class ConcreteStrategyB implements Strategy {
    @Override
    public void Strategy() {
        System.out.println("算法B实现");
    }
}


/**
 * 策略实现C
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:14
 */
public class ConcreteStrategyC implements Strategy{

    @Override
    public void Strategy() {
        System.out.println("算法C实现");
    }
}

Context类

/**
 * 策略配置类,维护一个Strategy的引用
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:15
 */
public class Context {

    //声明策略接口
    private Strategy strategy;

    //使用聚合的方式
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    
    //提供set方法,支持运行时改变算法
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    //根据具体的策略对象,调用其算法的方法
    public void ContextStrategy(){
        strategy.Strategy();
    }
   
}

Main方法

/**
 * 策略模式启动类
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2022/9/6 - 18:19
 */
public class Main
{
    //TODO:代码可以优化,new的具体算法,可以放到配置文件中。
    //运行时读取配置文件
    public static void main(String[] args) {
        Context context;
        //new 一个context对象
        context=new Context(new ConcreteStrategyA());
        context.ContextStrategy();
        
        //运行时改变策略
        context.setStrategy(new ConcreteStrategyB());
        context.ContextStrategy();

        context.setStrategy(new ConcreteStrategyC());
        context.ContextStrategy();
    }

}

拓展

JDK源码

Comparator接口是一个常用的比较器,其中compare()就是一个策略模式的抽象体现

public static void main2(String[] args) {
        Integer[] ints={1,3,8,2,4,9,0};

        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 > o2) {
                    return 1;
                }
                return -1;
            }
        };

        Arrays.sort(ints,comparator);

        System.out.println(Arrays.toString(ints));

 }

Spring源码

Spring的初始化采用了策略模式,即不同类型的类采用不同的初始化策略。

策略模式的注意实现和细节

1)策略模式的关键是 :分析项目中变化部分与不变部分

2)策略模式的核心思想是 :多用组合/聚合,少用继承;用行为类组合,而不是行为的继承。更有弹性。

3)体现了“开闭原则”。客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if…else if … else);

4)提供了可以替换继承关心的办法 :策略模式将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展。

5)需要注意的是 :每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大。

以上就是深入了解Java设计模式之策略模式的详细内容,更多关于Java策略模式的资料请关注脚本之家其它相关文章!

相关文章

  • java连接mysql数据库的方法

    java连接mysql数据库的方法

    这篇文章主要为大家详细介绍了java连接mysql数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java应用程序开发学习之static关键字应用

    Java应用程序开发学习之static关键字应用

    今天小编就为大家分享一篇关于Java应用程序开发学习之static关键字应用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Spring MVC中的常用注解及用法小结

    Spring MVC中的常用注解及用法小结

    这篇文章主要介绍了Spring MVC中的常用注解及其用法,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • JavaWeb页面中防止点击Backspace网页后退情况

    JavaWeb页面中防止点击Backspace网页后退情况

    当键盘敲下后退键(Backspace)后怎么防止网页后退情况呢?今天小编通过本文给大家详细介绍下,感兴趣的朋友一起看看吧
    2016-11-11
  • 基于SpringBoot应用监控Actuator安全隐患及解决方式

    基于SpringBoot应用监控Actuator安全隐患及解决方式

    这篇文章主要介绍了SpringBoot应用监控Actuator安全隐患及解决方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringBoot启动失败的原因及其解决方法

    SpringBoot启动失败的原因及其解决方法

    对于springboot的启动失败,相信大家都有经历,但是为什么会启动失败,以及怎么解决都只能通过日志进行查看,在这里,我会将常见的springboot启动失败的报错一一展示,需要的朋友可以参考下
    2024-06-06
  • Java 深入分析链表面试实例题目

    Java 深入分析链表面试实例题目

    链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,本篇带你通过两个实例题目来深入探索
    2022-03-03
  • Java图形化编程中的键盘事件设计简介

    Java图形化编程中的键盘事件设计简介

    这篇文章主要介绍了Java图形化编程中的键盘事件设计,是Java的GUI编程当中的基础部分,需要的朋友可以参考下
    2015-10-10
  • Java SE判断两个文件内容是否相同的多种方法代码

    Java SE判断两个文件内容是否相同的多种方法代码

    昨天因为要帮师兄的忙所以看了一下如何判断两个文件内容是否相同,这里给大家总结下,这篇文章主要给大家介绍了关于Java SE判断两个文件内容是否相同的多种方法,需要的朋友可以参考下
    2023-11-11
  • springboot+mybatis+redis 二级缓存问题实例详解

    springboot+mybatis+redis 二级缓存问题实例详解

    Mybatis默认没有开启二级缓存,需要在全局配置(mybatis-config.xml)中开启二级缓存。本文讲述的是使用Redis作为缓存,与springboot、mybatis进行集成的方法。需要的朋友参考下吧
    2017-12-12

最新评论