设计模式 --- 策略模式

​策略模式(Strategy Pattern)是一种 ​​行为型设计模式​​,用于动态切换算法或策略​​,使得算法可以独立于客户端变化。它通过封装算法策略并使其可互换,提升了系统的灵活性和扩展性,尤其适用于需要多种算法变体需要避免使用复杂条件分支的场景。

优点:

​​​​1.符合开闭原则​​
​​扩展性​​:新增策略时无需修改现有代码,只需添加新的策略类。
​​维护性​​:修改某个策略的实现不会影响其他策略或上下文逻辑。
​​2.消除复杂条件分支​​
避免大量 if-else 或 switch 语句,代码更简洁清晰。
3.​​算法复用​​
同一策略可被多个上下文对象复用(如多个敌人共享同一个追击策略)。
​​4.动态切换行为​​
运行时灵活切换策略(如根据游戏难度动态调整敌人AI)。

缺点:

1.​​类数量膨胀​​
每个策略对应一个类,可能导致类数量过多(例如10种移动策略 → 10个类)。
​​优化​​:使用工厂模式或ScriptableObject统一管理策略创建。
2.​​客户端需了解策略差异​​
客户端需要知道不同策略的存在及其适用场景,可能增加使用复杂度。
​​优化​​:通过配置文件或策略工厂隐藏策略实现细节。
​​3.过度设计风险​​
简单算法(如单一固定行为)使用策略模式可能增加不必要的复杂性。
​​4.性能开销​​
高频切换策略可能导致对象创建/销毁开销(如每帧切换策略)。
​​优化​​:将无状态的策略类设为单例,或使用对象池复用策略实例。

说明例子:

1.UML类图:

2.实现:

1.定义策略基类:

public abstract class Strategy
{public abstract void AlgorithmInterface();
}

2.定义策略上下文类:

   public class StrategyContext{Strategy m_strategy = null;//设置算法public void SetStrategy(Strategy strategy){m_strategy = strategy;}//执行当前算法public void ContextInterface(){m_strategy.AlgorithmInterface();}}

3.定义具体策略类:

    public class ConcreteStrategyA : Strategy{public override void AlgorithmInterface(){Debug.Log("ConcreateStrategyA.AlgorithmInterface");}}public class ConcreteStrategyB : Strategy{public override void AlgorithmInterface(){Debug.Log("ConcreateStrategyB.AlgorithmInterface");}}public class ConcreteStrategyC : Strategy{public override void AlgorithmInterface(){Debug.Log("ConcreateStrategyC.AlgorithmInterface");}}

4.测试类:

public class StrategyPattern : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){StrategyContext context = new StrategyContext();//设置算法context.SetStrategy(new ConcreteStrategyA());context.ContextInterface();context.SetStrategy(new ConcreteStrategyB());context.ContextInterface();context.SetStrategy(new ConcreteStrategyC());context.ContextInterface();}
}

游戏中使用场景:

​​1.AI行为系统​​
​​敌人移动策略​​:追击、绕后、随机游走、巡逻路径。
​​攻击策略​​:近战连击、远程射击、投掷炸弹、召唤援军。
2.​​技能/武器系统​​
​​武器开火模式​​:点射、连发、散射、蓄力攻击。
​​技能释放逻辑​​:单体锁定、区域AOE、链式弹射。
​​3.伤害计算系统​​
​​伤害公式​​:物理伤害、魔法伤害、真实伤害(无视防御)。
​​抗性计算​​:不同属性(火、冰、毒)使用独立的抗性策略。
4.​​游戏难度调整​​
​​简单难度​​:敌人使用保守策略(低攻击频率、低伤害)。
​​困难难度​​:敌人使用激进策略(高攻击频率、包围战术)。

总结:

策略模式通过解耦算法实现与使用​​,为游戏开发提供了高度灵活的决策系统,尤其适用于需要动态切换行为或维护多种算法变体的场景,其核心价值在于提升代码可维护性​、增强扩展性​​。

参考书籍:

《Hands-On Game Development Patterns with Unity 2019》

《设计模式与游戏完美开发》

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

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

相关文章

【论文阅读】RMA: Rapid Motor Adaptation for Legged Robots

Paper: https://arxiv.org/abs/2107.04034Project: https://ashish-kmr.github.io/rma-legged-robots/Code: https://github.com/antonilo/rl_locomotion训练环境:Raisim 1.方法 RMA(Rapid Motor Adaptation)算法通过两阶段训练实现四足机器…

QQ风格客服聊天窗口

QQ风格客服聊天窗口 展示引入方式 展示 引入方式 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

【家政平台开发(37)】家政平台蜕变记:性能优化与代码重构揭秘

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…

PostgreSQL 的 COPY 命令

PostgreSQL 的 COPY 命令 PostgreSQL 的 COPY 命令是高效数据导入导出的核心工具&#xff0c;性能远超常规 INSERT 语句。以下是 COPY 命令的深度解析&#xff1a; 一 COPY 命令基础 1.1 基本语法对比 命令类型语法示例执行位置文件访问权限服务器端COPYCOPY table FROM /p…

Sa-Token 自定义插件 —— SPI 机制讲解(一)

前言 博主在使用 Sa-Token 框架的过程中&#xff0c;越用越感叹框架设计的精妙。于是&#xff0c;最近在学习如何给 Sa-Token 贡献自定义框架。为 Sa-Token 的开源尽一份微不足道的力量。我将分三篇文章从 0 到 1 讲解如何为 Sa-Token 自定义一个插件&#xff0c;这一集将是前沿…

论文精度:基于LVNet的高效混合架构:多帧红外小目标检测新突破

论文地址:https://arxiv.org/pdf/2503.02220 目录 一、论文背景与结构 1.1 研究背景 1.2 论文结构 二、核心创新点解读 2.1 三大创新突破 2.2 创新结构原理 2.2.1 多尺度CNN前端 2.2.2 视频Transformer设计 三、代码复现指南 3.1 环境配置 3.2 数据集准备 3.3 训…

解决 Ubuntu 上 Docker 安装与网络问题:从禁用 IPv6 到配置代理

解决 Ubuntu 上 Docker 安装与网络问题的实践笔记 在 Ubuntu&#xff08;Noble 版本&#xff09;上安装 Docker 时&#xff0c;我遇到了两个常见的网络问题&#xff1a;apt-get update 失败和无法拉取 Docker 镜像。通过逐步排查和配置&#xff0c;最终成功运行 docker run he…

指针的进阶2

六、函数指针数组 字符指针数组 - 存放字符指针的数组 char* arr[10] 整型指针数组 - 存放整型指针的数组 int* arr[10] 函数指针数组 - 存放函数指针的数组 void my_strlen() {} int main() {//指针数组char* ch[5];int arr[10] {0};//pa是是数组指针int (*pa)[10] &…

速盾:高防CDN节点对收录有影响吗?

引言 搜索引擎收录是网站运营中至关重要的环节&#xff0c;它直接影响着网站的曝光度和流量。近年来&#xff0c;随着网络安全威胁的增加&#xff0c;许多企业开始采用高防CDN&#xff08;内容分发网络&#xff09;来保护其网站免受DDoS攻击和其他形式的网络攻击。然而&#x…

2025蓝桥杯省赛C/C++研究生组游记

前言 至少半年没写算法题了&#xff0c;手生了不少&#xff0c;由于python写太多导致行末老是忘记打分号&#xff0c;printf老是忘记写f&#xff0c;for和if的括号也老是忘写&#xff0c;差点连&&和||都忘记了。 题目都是回忆版本&#xff0c;可能有不准确的地方。 …

Quill富文本编辑器支持自定义字体(包括新旧两个版本,支持Windings 2字体)

文章目录 1 新版&#xff08;Quill2 以上版本&#xff09;2 旧版&#xff08;Quill1版本&#xff09; 1 新版&#xff08;Quill2 以上版本&#xff09; 注意&#xff1a;新版设置 style"font-family: Wingdings 2" 这种带空格的字体样式会被过滤掉&#xff0c;故需特…

dbt:新一代数据转换工具

dbt&#xff08;Data Build Tool&#xff09;一款专为数据分析和工程师设计的开源工具&#xff0c;专注于 ETL/ELT 流程的数据转换&#xff08;Transform&#xff09;环节&#xff0c;帮助用户以高效、可维护的方式将原始数据转换为适合分析的数据模型。 用户只需要编写查询&am…

【家政平台开发(39)】解锁家政平台测试秘籍:计划与策略全解析

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…

Java中的Map vs Python字典:核心对比与使用指南

一、核心概念 1. 基本定义 Python字典&#xff08;dict&#xff09; &#xff1a;动态类型键值对集合&#xff0c;语法简洁&#xff0c;支持快速查找。Java Map&#xff1a;接口&#xff0c;常用实现类如 HashMap、LinkedHashMap&#xff0c;需声明键值类型&#xff08;泛型&…

C语言基础之数组

1. 一维数组的创建和初始化 数组的创建 数组是一组相同类型元素的集合。 数组的创建方式&#xff1a; type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n是一个常量表达式&#xff0c;用来指定数组的大小 数组创建的实例&#xff1a; //代码1int arr1[10]; …

虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?

虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解&#xff1f; code review! 文章目录 虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解&#xff1f;理解这句话的关键点1.类&#xff08…

提示词 (Prompt)

引言 在生成式 AI 应用中&#xff0c;Prompt&#xff08;提示&#xff09;是与大型语言模型&#xff08;LLM&#xff09;交互的核心输入格式。Prompt 的设计不仅决定了模型理解任务的准确度&#xff0c;还直接影响生成结果的风格、长度、结构与可控性。随着模型能力和应用场景…

十二、C++速通秘籍—静态库,动态库

上一章节&#xff1a; 十一、C速通秘籍—多线程-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147055932?spm1001.2014.3001.5502 本章节代码&#xff1a; cpp2/library CuiQingCheng/cppstudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/cppst…

什么是继承?js中有哪儿些继承?

1、什么是继承&#xff1f; 继承是面向对象软件技术中的一个概念。 2、js中有哪儿些继承&#xff1f; js中的继承有ES6的类class的继承、原型链继承、构造函数继承、组合继承、寄生组合继承。 2.1 ES6中类的继承 class Parent {constructor() {this.age 18;} }class Chil…