广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 设计模式中的策略模式详情
  • 881
分享到

Java 设计模式中的策略模式详情

2024-04-02 19:04:59 881人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录策略模式的应用场景是否符合有没有必要不用策略模式例子使用策略模式策略上下文策略接口以及具体实现类Main类两种方式的不同策略模式有没有必要使用?如何避免Context类使用判断逻

策略模式的应用场景

策略模式是否要使用,取决于业务场景是否符合,有没有必要。

是否符合

如果业务是处于不同的场景时,采取不同的处理方式的话,就满足符合。 这里举几个业务栗子

如果今天我有1000块,那我就和朋友去游乐园玩、然后再去吃顿好吃的。如果有2000块的话,那我就先买一件好看的衣服,再和朋友去游乐园玩和吃好吃的商品收银业务,根据店中不同的活动分为正常收费、折扣收费、返利收费,每种收费的方式都不一样接收某安全设备的数据的时候,根据发过来不同的数据类型,执行设备报警、设备指定信息存储、设备本身状态信息修改等等的处理方式

这里上面三种业务场景都符合处于不同的场景时,采取不同的处理方式

有没有必要

这里等描述完例子后,再回到这个问题

例子

这里采用上面第三个例子的业务分别进行编写不用策略模式和用策略模式的效果

不用策略模式

public class Main {
    public static void main(String[] args) {
        //设备报警
        int deviceDataType=2;
        DeviceData deviceData=new DeviceData();
        deviceData.setName("安全设备A");

        switch (deviceDataType){
            case 1:
                DeviceCallPolice(deviceData);
                break;
            case 2:
                DeviceStatus(deviceData);
                break;
            default:
                System.out.println("没有相关的策略");
                break;
        }

    }
    private static void DeviceStatus(DeviceData deviceData) {
        System.out.println("正在修改"+deviceData.getName()+"状态为指定状态");
        System.out.println("正在记录本次修改状态的时间信息");
        System.out.println("根据修改后的状态判断是否要通知相关人");
    }
    private static void DeviceCallPolice(DeviceData deviceData) {
        System.out.println("正在修改"+deviceData.getName()+"状态为报警状态");
        System.out.println("正在记录本次报警时间信息");
        System.out.println("设备相关人的短信通知");
    }

}

效果:

使用策略模式

策略上下文


public class SafetyDeviceContext {

    private DeviceHandlerStrategy deviceHandlerStrategy;

    public SafetyDeviceContext(int dataType){
        switch (dataType){
            case 1:
                deviceHandlerStrategy=new DeviceCallPoliceStrategy();
                break;
            case 2:
                deviceHandlerStrategy=new DeviceStatusStrategy();
                break;
            default:
                System.out.println("没有相关的策略");
                break;
        }

    }
    public void Handler(DeviceData deviceData){

        deviceHandlerStrategy.handler(deviceData);
    }
}

策略接口以及具体实现类


public interface DeviceHandlerStrategy {

    void handler(DeviceData deviceData);
}

public class DeviceCallPoliceStrategy implements DeviceHandlerStrategy {

    @Override
    public void handler(DeviceData deviceData) {

        System.out.println("正在修改设备状态为报警状态");
        System.out.println("正在记录本次报警时间信息");
        System.out.println("设备相关人的短信通知");
    }
}

public class DeviceStatusStrategy implements DeviceHandlerStrategy {

    @Override
    public void handler(DeviceData deviceData) {
        System.out.println("正在修改设备状态为指定状态");
        System.out.println("正在记录本次修改状态的时间信息");
        System.out.println("根据修改后的状态判断是否要通知相关人");
    }
}

Main类

public class Main {

    public static void main(String[] args) {
        //设备报警
        int deviceDataType=2;
        DeviceData deviceData=new DeviceData();
        deviceData.setName("安全设备A");
        SafetyDeviceContext safetyDeviceContext=new SafetyDeviceContext(deviceDataType);
        safetyDeviceContext.handler(deviceData);
    }
}

效果:

两种方式的不同

从简易和易懂程度来说,自然是不用策略模式好一些,用策略模式会导致类的增多,而且如果不懂策略模式的人去看代码时可读性不高。但使用策略模式胜于可扩展性和可维护性要强于不用策略模式的

使用策略模式在Main函数(使用方),消除了类型的swich判断,把这些判断放到了Context,使用方调用的时候,就不必过多关心设备处理策略,只需要把值传进Context就好了。

之前我很不理解策略模式为什么能避免使用多重条件判断,因为上面的写法只是把判断的代码移到了Context而已,要写的判断还是要写,直到我知道了采用字典和反射的方式时,就理解了,往下会说

  • 如果后续我们要添加一种"设备定时报告信息"业务处理方式时,使用策略模式那种只需要在Context添加一层case(也可以不需要,可以用反射的方式)和添加一个策略的实现类就好了,而不用策略模式需要在原来使用方的代码添加一层case,可能会影响到原来的业务稳定性。
  • 算法独立出来也方便我们使用单元测试进行测试

策略模式有没有必要使用?

策略模式的目的是减少具体的算法方式使用方式之间的耦合,避免多重if判断,并让具体的算法方法尽可能独立。所以实现的时候,必然成本会高一些。因此我们要使用策略模式的时候,要确定该业务业务本身是否复杂,后续是不是会时不时添加其他的处理方式
例如上面的第三个例子,设备对应的处理措施本身具备了复杂性,例如会涉及数据本身的处理、设备状态的更改、设备事件的触发等等处理措施,而且后续因业务的扩展,可能会添加不同的设备场景,不同的设备处理方式。像这种就可以考虑使用

如何避免Context类使用判断逻辑

可以采用字典+反射的方式进行避免

定义策略字典的全局变量


public class DeviceStrategyDictionary {
    public static HashMap<Integer,String> dictionary=new HashMap<>();

}

修改Context的代码

import java.util.HashMap;


public class SafetyDeviceContext {

    private DeviceHandlerStrategy deviceHandlerStrategy;

    public SafetyDeviceContext(int dataType) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        HashMap<Integer,String> dic= DeviceStrategyDictionary.dictionary;
        if(!dic.containsKey(dataType)){
            System.out.println("不包含该处理方式");
        }
        //使用反射的方式
        Class<?> fz=Class.forName(dic.get(dataType));
        deviceHandlerStrategy=(DeviceHandlerStrategy) fz.newInstance();

    }
    public void handler(DeviceData deviceData){

        deviceHandlerStrategy.handler(deviceData);
    }
}

Main方法

public class Main {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        //程序启动的时候
        DeviceStrategyDictionary.dictionary.put(1,"DeviceCallPoliceStrategy");
        DeviceStrategyDictionary.dictionary.put(2,"DeviceStatusStrategy");

        //设备报警
        int deviceDataType=2;
        DeviceData deviceData=new DeviceData();
        deviceData.setName("安全设备A");

        SafetyDeviceContext safetyDeviceContext=new SafetyDeviceContext(deviceDataType);

        safetyDeviceContext.handler(deviceData);
    }

}

效果:

这样就可以避免使用if判断了,不过反射也有相关的性能消耗,这点也需要做权衡。

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

--结束END--

本文标题: Java 设计模式中的策略模式详情

本文链接: https://www.lsjlt.com/news/168370.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java 设计模式中的策略模式详情
    目录策略模式的应用场景是否符合有没有必要不用策略模式例子使用策略模式策略上下文策略接口以及具体实现类Main类两种方式的不同策略模式有没有必要使用?如何避免Context类使用判断逻...
    99+
    2022-11-13
  • java设计模式--策略模式详解
    目录策略模式Demo代码:总结策略模式 策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。用算法族分别封装起来...
    99+
    2022-11-12
  • Java设计模式之java策略模式详解
    目录为什么使用策略模式?策略模式包含角色策略模式的类图排序案例策略模式的优点策略模式的缺点适用场景源码分析策略模式的典型应用Java Comparator 中的策略模式参考文...
    99+
    2022-11-12
  • Java设计模式之策略模式
    在一个收银系统中,如果普通用户、中级会员、高级会员分别对应着不同的优惠策略,常规编程就要使用一系列的判断语句,判断用户类型,这种情况下就可以使用策略模式。 一、概念理解 策略模式的概...
    99+
    2022-11-13
    Java 设计模式 策略模式
  • Python设计模式中的策略模式详解
    目录策略模式命令模式策略模式 策略模式是一个经典的模式,简化代码。 电商领域有个功能明细可以使用“策略”模式,就是根据客户的属性或订单中的商品计算折扣。 比如...
    99+
    2023-02-08
    Python策略模式 Python设计模式
  • Java中常用的设计模式之策略模式详解
    目录优点缺点使用场景一、实现方式1、订单类型枚举类2、订单处理接口3、普通订单处理器4、秒杀订单处理器5、拼团订单处理器6、下单管理器二、测试1、引入依赖2、测试用例总结优点 1.算...
    99+
    2022-11-13
  • Java设计模式之策略模式案例详解
    目录优缺点Spring中哪里使用策略模式策略模式设计图代码案例为什么使用策略模式 答:策略模式是解决过多if-else (或者switch-case)代码块的方法之一,提高代码的可维...
    99+
    2022-11-13
  • Java设计模式之策略模式示例详解
    目录定义结构UML类图UML序列图深入理解策略模式策略和上下文的关系策略模式在JDK中的应用该策略接口有四个实现类策略模式的优点策略模式的缺点策略模式的本质在讲策略模式之前,我们先看...
    99+
    2022-11-13
  • JavaScript设计模式之策略模式详解
    什么是设计模式?为什么需要学习设计模式? 学习设计模式的目的是:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络...
    99+
    2022-11-13
  • java设计模式策略模式图文示例详解
    目录策略模式意图问题解决方案真实世界类比策略模式结构伪代码策略模式适合应用场景实现方式策略模式优缺点策略模式优缺点与其他模式的关系策略模式 亦称:Strategy 意图 策略模式是一...
    99+
    2022-11-13
  • Java特性之设计模式【策略模式】
    一、策略模式 概述 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式 在策略模式中,我们创建表示各种策略的对象和一个行为随...
    99+
    2023-10-18
    策略模式 java 设计模式
  • java设计模式的策略模式是什么
    这篇文章主要介绍“java设计模式的策略模式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java设计模式的策略模式是什么”文章能帮助大家解决问题。策略模式亦称:Strategy意图策略模式是...
    99+
    2023-07-02
  • Python 中的设计模式详解之:策略模
    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用。《设计模式:可复用面向对象软件的基础》一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”。 1、策略模式概述 策略模式:定义一系列算法,把...
    99+
    2023-01-31
    详解 策略 模式
  • Java 设计模式中的命令模式详情
    目录模式介绍UML类图命令模式案例命令模式的注意事项和细节模式介绍 命令模式(Command Pattern) :在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收...
    99+
    2022-11-13
  • JAVA设计模式中的策略模式你了解吗
    目录策略模式策略模式是什么策略模式的使用场景策略模式实践总结策略模式 世界上本没有模式; 一些程序老鸟在长时间的编程工作总结出高效的代码写法被后世推崇; 并整理出固定的写法规范,这个...
    99+
    2022-11-13
  • java设计模式中策略模式的示例分析
    小编给大家分享一下java设计模式中策略模式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!策略模式策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实...
    99+
    2023-06-20
  • Java设计模式中的策略模式如何实现
    这篇文章主要介绍了Java设计模式中的策略模式如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java设计模式中的策略模式如何实现文章都会有所收获,下面我们一起来看看吧。1 概述在平时开发中,往往会遇到这...
    99+
    2023-06-30
  • C#设计模式之策略模式
    策略模式 所谓策略其实就是做一件事情有很多很多的方法,比如说一个商场要搞促销,促销的方式有可能有很多:打折啊,满100返50啊、积分等等之类的。这种不同的促销方式在我们系统中表示就是...
    99+
    2022-11-13
  • javascript设计模式之策略模式
    目录一. 认识策略模式二. 具体实现和思想三. 策略模式的实际运用四. 总结一. 认识策略模式 策略模式的定义:定义一系列的算法,将他们一个个封装起来,使他们直接可以相互替换。 策略...
    99+
    2022-11-12
  • QtC++ 设计模式(四)——策略模式
    策略模式 序言理解源码 序言 还是参考的菜鸟教程,会C++的还是看C++的方式来得舒服。 . 理解 使用符合UML规范的便于理解和回忆,接口其实就是普通的基类 . 源码 strategy.h /// 策略class Strat...
    99+
    2023-08-30
    c++ 设计模式 策略模式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作