当前位置: 首页 > 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工…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

无法与IP建立连接,未能下载VSCode服务器

如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

【AI学习】三、AI算法中的向量

在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...