当前位置: 首页 > news >正文

【设计模式】策略模式(行为型)⭐⭐

文章目录

  • 1.概念
    • 1.1 什么是策略模式
    • 1.2 优点与缺点
  • 2.实现方式
  • 3. Java 哪些地方用到了策略模式
  • 4. Spring 哪些地方用到了策略模式

1.概念

1.1 什么是策略模式

它允许用户在不修改现有对象的代码的情况下向对象添加新的功能;这种模式是通过创建一个包含该对象的包装对象来实现的,从而扩展该对象的功能。

1.2 优点与缺点

优点:
1.灵活性:策略模式提供了在运行时选择算法或行为的能力,使得算法或行为的变化独立于使用它们的客户。
2.扩展性:通过添加新的策略类,可以很容易地扩展系统的行为,符合开闭原则。
3.简化了代码:策略模式将算法封装在单独的类中,从而简化了上下文类,使得功能划分更加清晰。
4.避免使用多重条件选择语句:策略模式可以帮助避免复杂的条件语句,如多重if-else或switch语句,使代码更加优雅。
5.可维护性:由于算法被封装在不同的类中,因此代码更容易维护和理解。

缺点:
1.增加了系统的复杂性:策略模式引入了更多的类,这可能会增加系统的复杂性,尤其是在策略数量较多时。
2.客户端必须知道不同的策略:客户端必须知道可用的策略,并决定使用哪一个,这可能会导致客户端代码的复杂性增加。
3.策略之间的依赖性:如果策略之间有依赖关系,可能会导致系统变得更加复杂。
4.性能问题:如果策略对象的创建和销毁开销较大,可能会对性能产生影响,尤其是在频繁切换策略的情况下。
5.管理策略类:随着策略数量的增加,管理这些策略类可能会变得困难,尤其是在大型系统中。

2.实现方式

① 定义策略接口

public interface Strategy {void execute();
}

②创建实现了这个接口的具体策略类

public class ConcreteStrategyA implements Strategy {@Overridepublic void execute() {System.out.println("Executing Strategy A");}
}public class ConcreteStrategyB implements Strategy {@Overridepublic void execute() {System.out.println("Executing Strategy B");}
}

③ 创建一个上下文类,它持有一个策略对象的引用,并通过这个引用调用执行方法

public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}

④ 在客户端代码中使用上下文类和不同的策略

public class Client {public static void main(String[] args) {Context context = new Context(new ConcreteStrategyA());context.executeStrategy(); // 输出: Executing Strategy Acontext.setStrategy(new ConcreteStrategyB());context.executeStrategy(); // 输出: Executing Strategy B}
}

3. Java 哪些地方用到了策略模式

排序算法:Java的Collections.sort()方法可以接受一个Comparator接口的实例,这个接口就是一个策略模式的应用。你可以为不同的排序需求提供不同的Comparator实现。
Java I/O:Java的I/O类库中,InputStream、OutputStream、Reader和Writer等抽象类可以看作是策略模式的上下文,而它们各自的实现类(如FileInputStream、BufferedInputStream等)则充当具体的策略。
JDBC:JDBC(Java Database Connectivity)使用策略模式来允许不同的数据库驱动实现。DriverManager类根据URL来选择合适的Driver实现,而不同的Driver实现则对应不同的数据库连接策略。
命令行处理:例如Apache Commons CLI或其他命令行处理库,它们允许你定义不同的命令行选项处理策略。
设计模式:许多设计模式的实现都可能用到策略模式,比如工厂模式、命令模式等。
算法框架:在算法框架中,策略模式可以用来根据不同的输入或条件选择不同的算法实现。
业务规则引擎:在业务规则引擎中,策略模式可以用来根据不同的业务规则选择不同的处理策略。
策略模式在Spring框架中的应用:Spring框架中的许多地方都使用了策略模式,例如,事务管理、数据源选择、消息中间件的连接等。

4. Spring 哪些地方用到了策略模式

事务管理:Spring的事务管理支持多种事务管理策略,如编程式事务管理(使用TransactionTemplate)和声明式事务管理(使用@Transactional注解)。这些不同的策略可以通过配置来切换,而不需要修改业务代码。
数据源选择:在Spring中,你可以配置多个数据源,并通过TransactionManager和DataSource接口来切换不同的数据源实现。
消息中间件的连接:Spring支持多种消息中间件,如JMS、RabbitMQ、Kafka等。通过策略模式,Spring允许你根据需要选择不同的消息中间件连接策略。
AOP(面向切面编程):Spring AOP允许你定义切面(Aspect)和通知(Advice),这些可以看作是策略模式的具体策略。你可以根据需要选择不同的通知类型(如前置通知、后置通知等)来增强目标对象的行为。
事件驱动编程:Spring的事件驱动编程模型允许你定义不同的事件监听器(Listener),这些监听器可以看作是处理不同事件的策略。
资源访问:Spring的Resource接口允许你以统一的方式访问不同类型的资源(如文件系统、类路径、URL等),而具体的Resource实现则充当不同的访问策略。
Bean的作用域:Spring允许你为Bean定义不同的作用域(如单例、原型、请求、会话等),这些作用域可以看作是不同的生命周期管理策略。
数据绑定:Spring的WebDataBinder允许你为不同的数据绑定场景定义不同的数据转换和格式化策略。

相关文章:

【设计模式】策略模式(行为型)⭐⭐

文章目录 1.概念1.1 什么是策略模式1.2 优点与缺点 2.实现方式3. Java 哪些地方用到了策略模式4. Spring 哪些地方用到了策略模式 1.概念 1.1 什么是策略模式 它允许用户在不修改现有对象的代码的情况下向对象添加新的功能;这种模式是通过创建一个包含该对象的包装…...

《软件定义安全》之三:用软件定义的理念做安全

第3章 用软件定义的理念做安全 1.不进则退,传统安全回到“石器时代” 1.1 企业业务和IT基础设施的变化 随着企业办公环境变得便利,以及对降低成本的天然需求,企业始终追求IT集成设施的性价比、灵活性、稳定性和开放性。而云计算、移动办公…...

pdf文件在线压缩网站,pdf文件在线压缩工具软件

在数字化时代的今天,PDF文件已经成为我们日常生活和工作中不可或缺的一部分。然而,随着PDF文件的广泛使用,其文件大小问题也日益凸显。过大的PDF文件不仅占用了大量的存储空间,而且在传输和共享过程中也往往面临诸多不便。因此&am…...

java程序100道21-30

21.定义一个接口A,有一个String的常量值为Java的 s,有void 的print()方法和String 的getInfo()方法,类X是A的实现类,类A的print()方法输出常量s,方法getInfo()返回“Hello!!!” package Exercises.One_Hundred.Demo21; ​ public…...

英伟达SSD视觉算法模型训练、转换与部署

深度学习的训练和推理流程,是先采用高性能图形服务器使用深度学习框架来训练(Training)机器学习算法,研究大量的数据来学习一个特定的场景,完成后得到模型参数,再部署到终端执行机器学习推理(Inference),以训练好的模型从新数据中得出结论。 一般的深度学习项目,训练…...

智能变电站网络报文记录及故障录波分析装置

是基于Intel X86、PowerPC、FPGA等技术的高度集成化的硬件平台,采用了高性能CPU无风扇散热、网络数据采集、高速数据压缩存储加密等多种技术,实现了高性能计算、多端口同步高速数据采集、数据实时分析、大容量数据存储等功能。 ● 在满足工业标准的同时&…...

npm ERR! code E404 npm ERR! 404 Not Found - GET https://registry.npmjs.org/

npm ERR! code E404 npm ERR! 404 Not Found - GET https://registry.npmjs.org/ 📜 智能合约依赖下载失败的解决方案摘要引言正文内容1. 场景描述 🤔2. 可能原因分析2.1 包不存在或名称错误2.2 网络问题2.3 npm配置错误 3. 解决方案🛠️3.1 …...

Dockerfille解析

用于构建Docker镜像的文本,由一条条指令构成 Docker执行Dockerfile的流程 1. Docker从基础镜像执行一个容器 2. 执行一条指令并对容器进行修改 3. 执行类型Docker commit的命令添加一个新的镜像层 4. Docker再基于新的镜像执行一个新的容器 5. 执行Dockerfile中…...

定个小目标之刷LeetCode热题(14)

了解股票的都知道,只需要选择股票最低价格那天购入,在股票价格与最低价差值最大时卖出即可获取最大收益,总之本题只需要维护两个变量即可,minPrice和maxProfit,收益 prices[i] - minPrice,直接用代码描述如下 class …...

智慧管道管理:油气管道可视化的领先应用

通过图扑油气管道可视化技术,实现实时监控与数据分析,快速识别潜在风险,有效提升管道维护效率和安全性能。...

嵌入式仪器模块:示波器模块和自动化测试软件

示波器模块 • 32 位分辨率 • 125 MSPS 采样率 • 支持单通道/双通道模块选择 • 低速模式可实现实时功率分布和整机功率检测 • 高速模式可实现信号分析和上电时序测量 应用场景 • 抓取并分析波形的周期、幅值、异常信号等指标 • 电源纹波与噪声分析 • 信号模板比…...

组装服务器重装linux系统【idrac集成戴尔远程控制卡】

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…...

景区ar互动大屏游戏化体验提升营销力度

从20世纪60年代的初步构想,到如今全球范围内无数企业的竞相投入,AR增强现实技术已成为引领科技潮流的重要力量。而在这一浪潮中,中国的AR公司正以其独特的魅力和创新力,崭露头角。 中国的AR市场正在迎来前所未有的发展机遇。如今&…...

苍穹外卖笔记-07-菜品管理-增加、删除、修改、查询分页还有菜品起售或停售状态

菜品管理 1 新增菜品1.1 需求分析与设计1.2 代码开发文件上传新增菜品实现 1.3 功能测试 2 菜品分页查询2.1 需求分析和设计2.2 代码开发设计DTO类设计VO类Controller层Service层Mapper层 2.3 功能测试 3 删除菜品3.1 需求分析和设计3.2 代码开发Controller层Service层Mapper层…...

oracle dataguard 从库 MRP 进程的状态是 WAIT_FOR_GAP

因主库归档日志未备份直接删除后,从库不能更新,19c版本以上,之前未打补丁,使用 RECOVER STANDBY DATABASE FROM SERVICE PRM180;之后,在执行 alter database recover managed standby database using current logfil…...

【C语言】轻松拿捏-联合体

谢谢观看!希望以下内容帮助到了你,对你起到作用的话,可以一键三连加关注!你们的支持是我更新地动力。 因作者水平有限,有错误还请指出,多多包涵,谢谢! 联合体 一、联合体类型的声明二…...

基于Python定向爬虫技术对微博数据可视化设计与实现

基于Python定向爬虫技术对微博数据可视化设计与实现 Design and Implementation of Weibo Data Visualization Based on Python Web Scraping Techniques 完整下载链接:基于Python定向爬虫技术对微博数据可视化设计与实现 文章目录 基于Python定向爬虫技术对微博数据可视化设…...

【QT5】<总览三> QT常用控件

文章目录 前言 一、QWidget---界面 二、QPushButton---按钮 三、QRadioButton---单选按钮 四、QCheckBox---多选、三选按钮 五、margin&padding---边距控制 六、QHBoxLayout---水平布局 七、QVBoxLayout---垂直布局 八、QGridLayout---网格布局 九、QSplitter---…...

Python中的生成器表达式(generator expression)

Python中的生成器表达式(generator expression)是一种类似于列表解析(list comprehension)的语法结构,但它返回的是一个生成器(generator)对象,而不是一个完整的列表。生成器对象是一…...

Responder工具

简介 Responder是一种网络安全工具,用于嗅探和抓取网络流量中的凭证信息(如用户名、密码等)。它可以在本地网络中创建一个伪造的服务(如HTTP、SMB等),并捕获客户端与该服务的通信中的凭证信息。 Responder工…...

Electron鸿蒙PC上的系统托盘,坑比我想象的多三倍

Electron鸿蒙PC上的系统托盘,坑比我想象的多三倍 上个月我在做一个企业内部工具,需要在鸿蒙PC上实现系统托盘常驻和原生通知推送。本来以为这是个小功能,两三个小时搞定,结果愣是折腾了两天半。把过程记录下来,希望后…...

政府新媒体宣发审核和监测对内容合规有哪些意义

在政务新媒体全谱系发展的今天,信息发布面临着意识形态安全、法律合规、公民隐私保护等多重考验。建立完善的宣发审核与监测机制,对保障内容合规具有决定性的意义,它是数字政府建设中不可或缺的“安全阀”与“过滤器”。以下是宣发审核和监测…...

开源清理工具OpenClearn:透明可控的数字垃圾管理方案

1. 项目概述:一个开源的“清洁工”如何重塑你的数字生活如果你和我一样,是个在数字世界里摸爬滚打了十几年的老鸟,那你电脑里肯定也有一堆“数字垃圾”。这些垃圾不是指那些过时的文件,而是那些你明明已经删除了,但操作…...

架构设计经验分享:从方法论到落地的完整实践

写在前面 “架构"是技术圈里被滥用最严重的词之一。很多人一说架构就开始画框图、讲中间件、列技术栈,但问一句"你这个架构解决了什么问题”,答不上来。 我做架构这些年,最深的体会是:架构不是技术选型的堆砌&#xff0…...

基于Cursor的AI编程助手:从提示词工程到个性化工作流配置

1. 项目概述:一个基于Cursor的AI编程助手最近在GitHub上看到一个挺有意思的项目,叫mk-knight23/AI-ASSISTANT-CURSOR。乍一看名字,你可能以为又是一个普通的AI代码生成工具,但仔细研究下来,发现它的定位和实现思路有点…...

面试鸭:一站式面试题库解决方案,助你轻松备战技术面试

面试鸭:一站式面试题库解决方案,助你轻松备战技术面试 【免费下载链接】mianshiya-public 持续维护的企业面试题库网站,帮你拿到满意 offer!⭐️ 2026年最新Java面试题、前端面试题、AI大模型面试题、AI Agent面试题、RAG面试题、…...

OpenClaw-RUH:基于深度学习的机器人灵巧抓取框架解析与实践

1. 项目概述:当AI遇上“机械爪”最近在AI和机器人交叉的圈子里,一个名为“OpenClaw-RUH”的项目引起了我的注意。乍一看这个标题,你可能会觉得它又是一个开源的机械臂控制项目。但当我深入其代码仓库和社区讨论后,发现它的野心远不…...

保姆级教程:手把手教你将VisDrone数据集转成MOT格式,适配MOTR等模型训练

保姆级教程:手把手教你将VisDrone数据集转成MOT格式,适配MOTR等模型训练 在计算机视觉领域,多目标跟踪(MOT)一直是研究热点之一。而VisDrone作为无人机视角下的经典数据集,其丰富的场景和挑战性的标注使其成为MOT研究的理想选择。…...

完整指南:如何用3D打印技术构建高精度六轴机械臂Faze4

完整指南:如何用3D打印技术构建高精度六轴机械臂Faze4 【免费下载链接】Faze4-Robotic-arm All files for 6 axis robot arm with cycloidal gearboxes . 项目地址: https://gitcode.com/gh_mirrors/fa/Faze4-Robotic-arm Faze4是一个完全开源的6轴工业级机械…...

AISuperDomain:构建AI API智能网关,解决网络延迟与高可用难题

1. 项目概述与核心价值最近在折腾一些自动化脚本和本地化AI应用时,我遇到了一个挺普遍但又有点烦人的问题:如何让我的程序能稳定、高效地访问那些部署在境外的AI服务API,比如OpenAI、Claude或者一些开源的模型托管平台。直接调用?…...