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

编程-设计模式 22:策略模式

设计模式 22:策略模式

定义与目的
  • 定义:策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。
  • 目的:该模式的主要目的是将一组相关的算法封装成一系列可互换的类,并使它们可以相互替换。这样,算法可以独立于使用它的客户而变化。
实现示例

假设我们有一个简单的游戏,玩家可以选择不同的战斗策略来攻击敌人。我们可以使用策略模式来实现这个需求。

// 抽象策略
interface BattleStrategy {void attack();
}// 具体策略 - 近战攻击
class MeleeAttack implements BattleStrategy {@Overridepublic void attack() {System.out.println("Swinging sword!");}
}// 具体策略 - 远程攻击
class RangedAttack implements BattleStrategy {@Overridepublic void attack() {System.out.println("Shooting arrow!");}
}// 具体策略 - 魔法攻击
class MagicAttack implements BattleStrategy {@Overridepublic void attack() {System.out.println("Casting fireball!");}
}// 上下文 - 玩家
class Player {private BattleStrategy strategy;public Player(BattleStrategy strategy) {this.strategy = strategy;}public void setStrategy(BattleStrategy strategy) {this.strategy = strategy;}public void doBattle() {System.out.println("Player attacks:");strategy.attack();}
}// 客户端代码
public class Client {public static void main(String[] args) {Player player = new Player(new MeleeAttack());player.doBattle();  // 输出: Player attacks: Swinging sword!player.setStrategy(new RangedAttack());player.doBattle();  // 输出: Player attacks: Shooting arrow!player.setStrategy(new MagicAttack());player.doBattle();  // 输出: Player attacks: Casting fireball!}
}
使用场景
  • 当你需要在运行时选择不同的算法或行为时。
  • 当一组相关的行为应该可以动态地互换时。
  • 当算法的变化独立于使用它的客户时。

策略模式通过将一组相关的算法封装成一系列可互换的类,并使它们可以相互替换,使得算法可以独立于使用它的客户而变化。这对于需要在运行时选择不同的算法或行为的场景非常有用。

小结

策略模式是一种常用的行为型模式,它可以帮助你将一组相关的算法封装成一系列可互换的类,并使它们可以相互替换。这对于需要在运行时选择不同的算法或行为的场景非常有用。

相关文章:

编程-设计模式 22:策略模式

设计模式 22:策略模式 定义与目的 定义:策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。目的:该模式的主要目的是将一组相关的算法封装成一系列可…...

kafka 将log4j的项目升级到log4j2

kafka版本是kafka_2.11-2.0.0,由于引用的log4j有漏洞,而升级kafka可能影响比较大,所以更新log4j包的版本。 参考的是将log4j的项目升级到log4j2 主要步骤如下: cd kafka的目录 cd libs rm -f slf4j-log4j12-1.7.25.jar rm -f …...

【CSP2019 模拟赛】Time

题目描述: 小 A 现在有一个长度为 𝑛 的序列 {𝑥𝑖},但是小 A 认为这个序列不够优美。 小 A 认为一个序列是优美的,当且仅当存在 𝑘 ∈ [1, 𝑛],满足: &#…...

二叉树相关的算法题

二叉树相关的算法题 单值二叉树 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。 示例 1: 输入:[1,1,1,1,1,null,1] 输出:t…...

Unity URP 曲面细分学习笔记

学百人时遇到了曲面着色器的内容,有点糊里糊涂,于是上知乎找到了两篇大佬的文章 Unity URP 曲面细分 和 Unity曲面细分笔记,本文只是自己做学习记录使用 1.曲面细分与镶嵌 曲面细分或细分曲面(Subdivision surface)是…...

每天五分钟深度学习pytorch:训练神经网络模型的基本步骤

本文重点 本文个人认为是本专栏最重要的章节内容之一,前面我们学习了pytorch中的基本数据tensor,后面我们就将学学习深度学习模型的内容了,在学习之前,我们先来看一下我们使用pytorch框架训练神经网络模型的基本步骤,然后我们下面就将这些步骤分解开来,详细学习。 代码…...

【langchain学习】使用缓存优化langchain中的LLM调用性能:内存、SQLite与Redis的对比

在处理语言模型(LLM)调用时,特别是在需要多次执行相同请求的情况下,缓存机制能够显著提升系统的性能。本文通过对比内存缓存(InMemoryCache)、SQLite缓存(SQLiteCache)和Redis缓存(RedisCache),探讨了如何在Langchain中使用这些缓存机制来优化LLM调用的性能。 代码…...

spring boot 集成EasyExcel

EasyExcel 是一个基于 Java 的快速、简洁的 Excel 处理工具&#xff0c;它能够在不用考虑性能和内存等因素的情况下&#xff0c;快速完成 Excel 的读写功能。 首先&#xff0c;需要在 Spring Boot 项目中引入 EasyExcel 依赖。在 pom.xml 文件中添加以下依赖&#xff1a; <d…...

获取对象中第一个存在的值

在JavaScript中&#xff0c;要从一个对象中获取第一个存在的&#xff08;非undefined、非null、非空数组等&#xff09;值&#xff0c;你可以使用Object.values()方法结合Array.prototype.find()方法。以下是一个示例代码&#xff0c;演示如何实现这一点&#xff1a; const ob…...

Python学习笔记----集合与字典

1. 字符串、列表和元组的元素都是按下标顺序排列&#xff0c;可通过下 标直接访问&#xff0c;这样的数据类型统称为序列。 其中&#xff0c;字符串和元组中的元素不能修改&#xff0c;而列表中的元素可以修改。 集合 1. 与元组和列表类似&#xff0c;Set &#xff08;集合&a…...

c# 排序、强转枚举

List<Tuple<double,int>> mm中doble从小到大排序 mm本身排序 在C#中&#xff0c;如果你有一个List<Tuple<double, int>>类型的集合mm&#xff0c;并且你想要根据Tuple中的double值&#xff08;即第一个元素&#xff09;从小到大进行排序&#xff0c;同…...

“华为杯”第十六届中国研究生数学建模竞赛-C题:视觉情报信息分析

目录 摘 要: 一、问题重述 二、模型假设 三、符号说明 四、问题一分析与求解 4.1 问题一分析 4.2 模型建立 4.2.1 位置变换模型建立 4.2.4 多平面转换模型建立 4.3 模型求解 4.3.1 问题一图 1 结果 4.3.2 问题一图 2 结果 4.3.3 问题一图 3 结果 4.3.4 问题一图 4 结果 4.4 模…...

html+css+js网页设计 找法网2个页面(带js)ui还原度百分之90

htmlcssjs网页设计 找法网2个页面&#xff08;带js&#xff09;ui还原度百分之90 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑…...

018 | backtrader回测反转策略

什么是反转策略&#xff1f; 反转策略&#xff08;Reversal Strategy&#xff09;是一种试图捕捉市场价格趋势逆转的交易策略。与趋势跟随策略不同&#xff0c;反转策略的核心理念是“物极必反”&#xff0c;即价格在经过一段时间的单边趋势后&#xff0c;往往会出现逆转的机会…...

《图解HTTP》全篇目录

前言 目前&#xff0c;国内讲解 HTTP 协议的书实在太少了。在我的印象中&#xff0c;讲解网络协议的书仅有两本。一本是《HTTP 权威指南》&#xff0c;但其厚度令人望而生畏&#xff1b;另一本是《TCP/IP 详解&#xff0c;卷 1》&#xff0c;内容艰涩难懂&#xff0c;学习难度…...

基于VS2019(Release_x64)+Qt的软件开发—环境配置

前置博客&#xff1a; 基于C高级编程语言的软件开发随记——环境变量-CSDN博客 &#xff08;一&#xff09;一种避免设置大量环境变量的VS2019环境配置方法 Ⅰ 解决方案资源管理器->VC目录->在包含目录/库目录中添加对应的include/lib文件夹&#xff08;$&#xff08;So…...

【书生大模型实战营(暑假场)闯关材料】入门岛:第1关 Linux 基础知识

【书生大模型实战营&#xff08;暑假场&#xff09;闯关材料】入门岛&#xff1a;第1关 Linux 基础知识 1. 使用VScode进行SSH远程连接服务器2. 端口映射及实例参考文献 这一博客主要介绍使用VScode进行服务器远程连接及端口映射。 1. 使用VScode进行SSH远程连接服务器 安装V…...

240810-Gradio通过HTML组件打开本地文件+防止网页跳转到about:blank

A. 最终效果 B. 可通过鼠标点击打开文件&#xff0c;但会跳转到about:blank import gradio as gr import subprocessdef open_pptx():pptx_path /Users/liuguokai/Downloads/240528-工业大模型1.pptxtry:subprocess.Popen([open, pptx_path])return "PPTX file opened s…...

go在linux上安装

1.首先要确定Linux架构 uname -m如果你的系统是 armv7l&#xff08;32-bit ARM&#xff09;&#xff0c;你需要下载 armv6l 版的Go语言。 如果你的系统是 aarch64&#xff08;64-bit ARM&#xff09;&#xff0c;你需要下载 arm64 版的Go语言。 如果你的系统是 x86_64&#xf…...

算法日记day 35(动归之分割等和子集|最后一块石头的重量2)

一、分割等和子集 题目&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分…...

洗衣留香珠市场:其中亚太地区以12.5%的增速领跑全球市场

据权威市场研究机构预测&#xff0c;2024年全球洗衣留香珠市场规模预计突破35亿美元&#xff0c;年复合增长率达8.2%&#xff0c;其中亚太地区以12.5%的增速领跑全球市场。这一功能性香氛产品正从附加型消费向日常洗护必需品转型&#xff0c;其技术迭代与市场渗透呈现出高端化、…...

面试题-Mysql篇

什么是存储过程存储过程是一组SQL语句的集合&#xff0c;它们在数据库中预先编译并存储。它们用于封装一组操作&#xff0c;提高性能、减少网络流量&#xff0c;并提供可重用的代码逻辑。存储过程还可以实现数据安全性和数据完整性。mysql如何查询最后一条数据使用ORDER BY根据…...

LumiPixel Canvas Quest集成Vue.js:打造动态人像画廊管理后台

LumiPixel Canvas Quest集成Vue.js&#xff1a;打造动态人像画廊管理后台 1. 项目背景与需求分析 在数字内容创作领域&#xff0c;AI生成人像正成为设计师和内容创作者的重要工具。传统人工绘制方式耗时费力&#xff0c;而直接使用AI生成工具又缺乏系统化管理。我们团队最近用…...

VS2022 + WinForms:从拖控件到写逻辑,手把手带你做出第一个C#计算器

VS2022 WinForms&#xff1a;从拖控件到写逻辑&#xff0c;手把手带你做出第一个C#计算器 第一次打开Visual Studio 2022时&#xff0c;那个闪亮的启动界面可能会让你既兴奋又不知所措。作为微软最新的集成开发环境&#xff0c;VS2022为C#开发者提供了强大的工具链&#xff0…...

用8086和蜂鸣器DIY音乐盒:手把手教你复刻童年旋律(附完整汇编代码)

用8086和蜂鸣器DIY音乐盒&#xff1a;手把手教你复刻童年旋律&#xff08;附完整汇编代码&#xff09; 记得小时候第一次听到电子贺卡发出《生日快乐》的单调旋律时&#xff0c;那种机械却又神奇的"音乐"让我盯着电路板研究了半天。现在想来&#xff0c;那些简单的方…...

手把手搭建基于Kintex UltraScale+的Cameralink图像处理系统:从LVDS解码到GTY输出HDMI的完整Vivado工程解析

手把手搭建基于Kintex UltraScale的Cameralink图像处理系统&#xff1a;从LVDS解码到GTY输出HDMI的完整Vivado工程解析 在工业视觉和医疗影像领域&#xff0c;Cameralink接口凭借其高带宽和低延迟特性&#xff0c;依然是许多高端相机的首选接口方案。而Xilinx的Kintex UltraSca…...

VLM | 从视觉语言模型到自动驾驶决策的“慢思考”系统

1. 视觉语言模型&#xff08;VLM&#xff09;的本质与突破 当我们谈论自动驾驶时&#xff0c;大多数人首先想到的是激光雷达、摄像头和复杂的算法。但真正让机器"理解"复杂交通场景的&#xff0c;其实是背后那个能看懂图像、读懂文字、还能进行逻辑推理的"大脑&…...

Phi-4-mini-reasoning在LSTM时间序列预测中的应用与优化

Phi-4-mini-reasoning在LSTM时间序列预测中的应用与优化 1. 当传统预测遇上智能推理 时间序列预测一直是数据分析领域的经典难题。无论是股票价格波动还是商品销量变化&#xff0c;传统的LSTM模型虽然能捕捉时间依赖关系&#xff0c;但面对突发新闻事件或政策变化时&#xff…...

FRP内网穿透实战:5分钟搞定Linux服务器+Docker部署(含HTTPS配置)

FRP内网穿透实战&#xff1a;Linux服务器与Docker部署全指南 引言 在当今分布式开发和远程办公的浪潮中&#xff0c;内网穿透技术已成为开发者工具箱中不可或缺的一部分。想象一下这样的场景&#xff1a;你正在本地开发一个Web应用&#xff0c;需要让远方的同事实时预览效果&am…...

mxbai-embed-large-v1效果展示:超越OpenAI的文本嵌入模型实测

mxbai-embed-large-v1效果展示&#xff1a;超越OpenAI的文本嵌入模型实测 1. 引言&#xff1a;文本嵌入技术的新标杆 在自然语言处理领域&#xff0c;文本嵌入模型正成为各类智能应用的基础设施。mxbai-embed-large-v1作为最新开源的文本嵌入模型&#xff0c;在MTEB基准测试中…...