Java设计模式之策略模式深入刨析

 更新时间:2022年05月16日 09:51:27   作者:行万里路,读万卷书  
策略模式属于Java 23种设计模式中行为模式之一,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。本文将通过示例详细讲解这一模式,需要的可以参考一下

1.基本介绍

1)策略模式(Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

2)这算法体现了几个设计原则,第一,把变化的代码从不变的代码中分离出来;第二,针对接口编程而不是具体类(定义了策略接口);第三,多用组合/聚合,少用继承(客户通过组合方式使用策略)

例如:针对环境节能,提出了三种节能方式:基带板节能,SPC节能,产品节能,不同的节能方式,对环境设备的具体处理流程不同

2.传统方式

(1)类图

(2)编码实现

1)定义一个EsPolicy抽象类,定义esPolicyHandler方法

public abstract class EsPolicy {
    public void esPolicyHandler() {
    }
}

2)BbEsPolicy继承EsPolicy,并复写esPolicyHandler方法

public class BbEsPolicy extends EsPolicy {
    @Override
    public void esPolicyHandler() {
        System.out.println("===处理基带板节能策略===");
    }
}

3)SpcEsPolicy继承EsPolicy,并复写esPolicyHandler方法

public class SpcEsPolicy extends EsPolicy {
    @Override
    public void esPolicyHandler() {
        System.out.println("===Spc节能策略处理===");
    }
}

4)ProdEsPolicy继承EsPolicy,并复写esPolicyHandler方法

public class ProdEsPolicy extends EsPolicy {
    @Override
    public void esPolicyHandler() {
        System.out.println("===产品节能策略处理===");
    }
}

5)测试

public class EsPolicyTest {
    public static void main(String[] args) {
        EsPolicy bbEsPolicy = new BbEsPolicy();
        bbEsPolicy.esPolicyHandler();
        SpcEsPolicy spcEsPolicy = new SpcEsPolicy();
        spcEsPolicy.esPolicyHandler();
        ProdEsPolicy prodPolicy = new ProdEsPolicy();
        prodPolicy.esPolicyHandler();
    }
}

执行结果

===处理基带板节能策略===
===Spc节能策略处理===
===产品节能策略处理===

问题:传统方法是通过子类继承父类并复写父类方法来实现不同子类的不同行为,对类的局部改动,尤其是超类的局部改动,会影响其它部分,会有溢出效应

3.采用策略模式

(1)类图

(2)编码实现

1)定义策略接口并定义抽象方法

public interface EsPolicyHandler {
    void esPolicyHandler();
}

2)BbEsPolicyHandler实现策略接口,并实现esPolicyHandler方法

public class BbEsPolicyHandler implements EsPolicyHandler {
    @Override
    public void esPolicyHandler() {
        System.out.println("===基带板节能策略处理===");
    }
}

3)SpcEsPolicyHandler实现策略接口,并实现esPolicyHandler方法

public class SpcEsPolicyHandler implements EsPolicyHandler {
    @Override
    public void esPolicyHandler() {
        System.out.println("===Spc节能策略处理===");
    }
}

4)ProdEsPolicyHandler实现策略接口,并实现esPolicyHandler方法

public class ProdEsPolicyHandler implements EsPolicyHandler {
    @Override
    public void esPolicyHandler() {
        System.out.println("===产品节能策略处理===");
    }
}

5)定义EsPolicy抽象类,注入EsPolicyHandler作为其属性

public abstract class EsPolicy {
    EsPolicyHandler esPolicyHandler;
    public void setEsPolicyHandler(EsPolicyHandler esPolicyHandler) {
        this.esPolicyHandler = esPolicyHandler;
    }
    public void esPolicyHandler() {
        if (null != esPolicyHandler) {
            esPolicyHandler.esPolicyHandler();
        }
    }
}

6)BbEsPolicy继承EsPolicy,在构造方法中实例化esPolicyHandler接口属性

public class BbEsPolicy extends EsPolicy {
    public BbEsPolicy() {
        esPolicyHandler = new BbEsPolicyHandler();
    }
}

7)SpcEsPolicy继承EsPolicy,在构造方法中实例化esPolicyHandler接口属性

public class SpcEsPolicy extends EsPolicy {
    public SpcEsPolicy() {
        esPolicyHandler = new SpcEsPolicyHandler();
    }
}

8)ProdEsPolicy继承EsPolicy,在构造方法中实例化esPolicyHandler接口属性

public class ProdEsPolicy extends EsPolicy {
    public ProdEsPolicy() {
        esPolicyHandler = new ProdEsPolicyHandler();
    }
}

9)测试

public class EsPolicyTest {
    public static void main(String[] args) {
        BbEsPolicy bbEsPolicy = new BbEsPolicy();
        bbEsPolicy.esPolicyHandler();
        SpcEsPolicy spcEsPolicy = new SpcEsPolicy();
        spcEsPolicy.esPolicyHandler();
        ProdEsPolicy prodEsPolicy = new ProdEsPolicy();
        prodEsPolicy.esPolicyHandler();
    }
}

10)执行结果

===处理基带板节能策略===
===Spc节能策略处理===
===产品节能策略处理===

4.策略模式的注意事项和细节

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

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

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

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

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

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

相关文章

  • 学习Java HashMap,看这篇就够了

    学习Java HashMap,看这篇就够了

    这篇文章主要介绍了Java HashMap的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 详解SpringMVC @RequestBody接收Json对象字符串

    详解SpringMVC @RequestBody接收Json对象字符串

    这篇文章主要介绍了详解SpringMVC @RequestBody接收Json对象字符串,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • SpringBoot中支持Https协议的实现

    SpringBoot中支持Https协议的实现

    本文主要介绍了SpringBoot中支持Https协议的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 重学SpringBoot3之如何发送Email邮件功能

    重学SpringBoot3之如何发送Email邮件功能

    这篇文章主要给大家介绍了重学SpringBoot3之如何发送Email邮件功能的相关资料,文中包括环境准备、项目配置、代码实现、最佳实践和安全性建议,通过采用异步发送、重试机制、限流等最佳实践,可以构建一个健壮的邮件发送系统,需要的朋友可以参考下
    2024-11-11
  • java中@ModelAttribute注解的作用

    java中@ModelAttribute注解的作用

    本文主要介绍了java中@ModelAttribute注解的作用。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java实现弹窗效果的基本操作(2)

    Java实现弹窗效果的基本操作(2)

    这篇文章主要为大家详细介绍了Java实现弹窗效果的基本操作第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Java常见数据结构面试题(带答案)

    Java常见数据结构面试题(带答案)

    这篇文章主要介绍了Java常见数据结构面试题,带有答案及解释,希望对广大的程序爱好者有所帮助,同时祝大家有一个好成绩,需要的朋友可以参考下。
    2017-09-09
  • java获取两个数组中不同数据的方法

    java获取两个数组中不同数据的方法

    这篇文章主要介绍了java获取两个数组中不同数据的方法,实例分析了java操作数组的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • SpringBoot实现上传文件到AWS S3的代码

    SpringBoot实现上传文件到AWS S3的代码

    这篇文章主要介绍了SpringBoot实现上传文件到AWS S3的代码,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-10-10
  • JavaSE一维数组和二维数组用法详解

    JavaSE一维数组和二维数组用法详解

    数组存储同一种数据类型多个元素的集合,既可以存储基本数据类型,也可以存储引用数据类型,这篇文章主要给大家介绍了关于JavaSE一维数组和二维数组用法的相关资料,需要的朋友可以参考下
    2024-04-04

最新评论