设计模式 策略模式(Strategy Pattern)

策略模式简绍

策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。该模式定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。

组成部分:

  • 环境(Context)类:它含有一个Strategy类型的成员变量,并且有一个方法与Strategy类型关联,通常会提供一个设置Strategy对象的方法。
  • 策略接口(Strategy):定义了一个统一的算法操作抽象接口。
  • 具体策略类(Concrete Strategies):实现了策略接口中定义的算法。

策略模式优缺点

优点:
  • 易于理解和实现:策略模式的概念简单明了,实现也不复杂。
  • 提高系统维护性:策略模式将一系列的算法封装在一个个独立的类中,使得可以方便地增加新的算法或者改进已有算法而不影响客户端代码。
  • 增强系统的灵活性:策略模式允许在运行时动态地更改算法或行为,增强了系统的灵活性。
  • 符合开闭原则:新的算法可以自由添加到系统中而不影响现有的客户端代码,因为客户端是通过策略接口来访问算法的。
缺点:
  • 客户端必须了解所有的策略类:客户端需要知道所有可用的策略类,并自行决定使用哪一个策略,这增加了客户端的复杂度。
  • 策略类的增加导致类的数目增加:每增加一种算法都需要新增一个策略类,如果算法很多,则会导致系统中类的数量急剧增加。
  • 过多的子类可能导致系统复杂化:如果策略类太多,可能会导致系统难以管理和理解。
  • 在某些情况下,策略模式可能不如继承有效:如果所有可能的变化都来源于同一个维度,那么继承可能比组合更合适。

UML图

以下代码示例图,ConcreteStrategiesA,ConcreteStrategiesB 实现了 Strategy 接口
在这里插入图片描述

实现代码

策略接口(Strategy):

定义了一个名为 Strategy 的接口,包含一个 adapter 方法,用于适配不同的接口类型。

public interface Strategy {void adapter(String port);
}
具体策略类(Concrete Strategies):

ConcreteStrategiesA 实现了 Strategy 接口,并提供了针对手机接口的适配逻辑。
ConcreteStrategiesB 实现了 Strategy 接口,并提供了针对电脑接口的适配逻辑。

public class ConcreteStrategiesA implements Strategy{@Overridepublic void adapter(String port) {System.out.println("手机接口" + port);}
}public class ConcreteStrategiesB implements Strategy{@Overridepublic void adapter(String port) {System.out.println("电脑接口" + port);}
}
环境类(Context):

Context 类持有策略对象,并提供了一个 adapter 方法,用于调用策略对象的 adapter 方法。
通过构造函数注入策略对象,使得 Context 可以在运行时动态地选择不同的策略。

public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public void adapter(String prot){strategy.adapter(prot);}}
主类(Main):

创建了两个不同的 Context 对象,分别使用 ConcreteStrategiesA 和 ConcreteStrategiesB。
调用 adapter 方法,输出不同的适配信息。

public class Main {public static void main(String[] args) {Context context = new Context(new ConcreteStrategiesA());context.adapter("usb-c");Context context1 = new Context(new ConcreteStrategiesB());context1.adapter("usb-c");}
}

常用场景

  • 算法选择
    当存在多种算法可以实现同一功能时,可以使用策略模式来动态地选择和切换算法。例如,在排序算法中,可以选择冒泡排序、快速排序、插入排序等多种算法。
  • 行为配置
    在某些场景下,需要根据不同的配置或上下文来选择不同的行为。例如,在游戏中,角色可能具有不同的攻击策略,如近战攻击、远程攻击或魔法攻击。
  • 多种配置选项
    在某些应用中,需要根据不同的配置来选择不同的处理方式。例如,在数据处理中,可能需要选择不同的数据格式进行读取或写入。

策略模式非常适合以下场景:
- 需要在运行时动态选择算法或行为。
- 存在多种实现方式,但实现方式的细节不应该影响到客户端。
- 需要将算法的实现与使用算法的客户端相分离。

通过策略模式,可以将算法的实现与使用算法的客户端相分离,使得系统更加灵活和可扩展

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/435741.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当前用户添加到 [uucp ]组

archlinux使用tabby 查看当前用户:将当前用户添加到 uucp 组验证组成员身份重新登录 /dev/ttyUSB0 设备的所有者是 root,而所属组是 uucp,如果您想以当前用户身份访问此设备,您可以将当前用户添加到 uucp 组中。 以下是将当前用户添加到 uucp…

初识C语言(三)

感兴趣的朋友们可以留个关注,我们共同交流,相互促进学习。 文章目录 前言 八、函数 九、数组 (1)数组的定义 (2)数组的下标和使用 十、操作符 (1)算数操作符 (2&#xff…

C# C++ 笔记

第一阶段知识总结 lunix系统操作 1、基础命令 (1)cd cd /[目录名] 打开指定文件目录 cd .. 返回上一级目录 cd - 返回并显示上一次目录 cd ~ 切换到当前用户的家目录 (2)pwd pwd 查看当前所在目录路径 pwd -L 打印当前物理…

Windows安装openssl开发库

1 下载openssl安装包并安装 下载网址: https://slproweb.com/products/Win32OpenSSL.html 下载对应的安装版本。 双击安装包,一路下一步完成安装。注意:1.安装路径不要有空格; 2. 建议不要把DLL拷贝到系统路径。 2 编辑代码 …

遇到慢SQL、SQL报错,应如何快速定位问题 | OceanBase优化实践

在数据库的使用中,大家时常会遇到慢SQL,或执行出错的SQL。对于某些SQL问题,其错误原因显而易见,但也有不少情况难以直观判断。面对这类问题,我们应当如何应对?如何准确识别SQL错误的根源?是否需…

针对考研的C语言学习(定制化快速掌握重点4)

typedef的使用 简化变量类型 逻辑结构 集合结构:无关系 线性结构:一对一 树形结构:一对多 图形结构:多对多 存储结构 顺序存储和链式存储(考代码) 顺序存储优点:1.可以实现随机存取。2.…

山大电力研发费用率远弱同行,先分红上亿再补流9000万?

《港湾商业观察》施子夫 8月9日,证监会网站披露深交所已向山东山大电力技术股份有限公司(以下简称,山大电力)发出第三轮审核问询函。据悉,2023年6月,山大电力递表深交所,保荐机构为兴业证券。 …

Redis入门第一步:认识Redis与快速安装配置

认识Redis与快速安装配置🍃 Redis是什么🐲 1.Redis的背景🎍 Redis(Remote Dictionary Server)译为"远程字典服务",它是一款基于内存实现的键值型 NoSQL 数据库, 通常也被称为数据结…

iOS 项目中的多主题颜色设计与实现

引言 在现代iOS应用中,用户对个性化体验的需求越来越高,除了功能上的满足,多样的视觉风格也是提升用户体验的重要手段之一。提供多主题颜色的切换功能不仅能满足用户的审美偏好,还可以让应用更具活力,适应不同场景下的…

周成虎院士团队和朴世龙院士合作发表Nature Communications:中国植树造林的固碳潜力评估

本文首发于“生态学者”微信公众号! 编者荐语:以下论文是中国科学院地理科学与资源研究所周成虎院士研究团队和朴世龙院士近期合作发表的研究,研究发现在中国强烈的人地矛盾和耕林博弈背景下,相较于新增林地,加密现有…

PCIe6.0 AIC金手指和板端CEM连接器信号完整性设计规范

先附上我之前写的关于PCIe5.0金手指的设计解读: PCIe5.0的Add-in-Card(AIC)金手指layout建议(一)_pcie cem-CSDN博客 PCIe5.0的Add-in-Card(AIC)金手指layout建议(二)_gnd bar-CSDN博客 首先,相较于PCI…

AIGAME平台的由来与未来展望 —— 蒙特加密基金推动区块链与AI融合创新

摘要: AIGAME平台凭借蒙特加密产业基金的战略投资,成为区块链与AI融合创新的先驱。该平台集成了链游、DeFi、加密聊天和跨境支付等多项功能,打造出一个多元化的Web3生态系统。未来,AIGAME将在技术创新和全球布局中持续引领潮流。 …

Ktor快速上手1 - 第一个服务端项目

Ktor 快速上手 第一个APP 工程创建 首先你需要创建一个Ktor工程,这里有两种办法创建: 网页创建后下载包到本地,作为工程打开:Ktor: Project Generator直接在IDEA里面创建Ktor工程 为了方便操作,这里直接在IDEA里面…

WebSocket 2024/9/30

WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 与HTTP协议的区别 实现

【自动驾驶】控制算法(十一)深度解析车辆纵向控制 | 纵向双 PID 控制算法

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

记录|Modbus-TCP产品使用记录【德克威尔】

目录 前言一、德克威尔1.1 实验图1.2 DECOWELL IO Tester 软件1.3 读写设置1.4 C#进行Modbus-TCP读写 更新时间 前言 参考文章: 使用的第二款Modbus-TCP产品。 一、德克威尔 1.1 实验图 1.2 DECOWELL IO Tester 软件 这也是自带模块配置软件的。下图就是德克威尔的…

AltiumDesigner脚本开发-DIP封装制作

1.点击工具栏的运行工具(蓝色向右三角图标)可以执行脚本程序; 2.点击菜单栏Run->Run可以执行脚本程序; 3.在脚本编辑器中,按键盘的F9键可以执行脚本程序; 4.通过菜单栏执行脚本程序(需要将程序添加到菜单栏中&am…

profinet转ethercat连接伺服在工业现场的配置案例

在工业通信领域,Profinet 转 EtherCAT 网关的应用为实现不同工业网络之间的通信提供了有效的解决方案。以下是一个关于 Profinet 转 EtherCAT 网关链接伺服配置的案例。 首先,我们需要准备好相关的硬件设备,包括 Profinet 转 EtherCAT 网关、…

VoLTE呼叫流程(VoLTE打VoLTE)

目录 01. VoLTE 呼叫流程中的主要子流程 02. 高层来看一个 VoLTE 的基本呼叫过程 03. 场景 04. 高层来看一个 VoLTE 基本呼叫的会话建立 05. 采用 Precondition 的基本呼叫建立流程 06. T-ADS 流程图 07. SIP 头部的 Route 和 Record-Route 头域 08. 第一个 AAR 和第二…

负载箱:充电桩测试利器

RCD负载箱是用于测试和验证电气设备在故障状态下的性能的设备。它可以模拟真实的负载情况,从而帮助工程师和技术人员对设备进行准确的检测和维护。此外,RCD负载箱也是一种重要的安全保护设备,主要用于防止电路中的漏电现象引发的事故。它通常…