【设计模式】策略模式(行为型)⭐⭐
文章目录
- 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工…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...