Unity 虚拟仿真实验中设计模式的使用 ——策略模式(Strategy Pattern) - 指南

news/2025/10/22 20:10:04/文章来源:https://www.cnblogs.com/yxysuanfa/p/19158864

目录

  1. 前言

  2. 什么是策略模式

  3. 案例背景:虚拟仿真实验中的加热策略

  4. 案例效果图(示意)

  5. 代码实现

    • 5.1 策略接口:IHeatingStrategy

    • 5.2 具体策略类:SlowHeating / FastHeating / MicrowaveHeating

    • 5.3 上下文类:WaterHeaterContext

    • 5.4 UI 控制:策略选择按钮

  6. 运行流程

  7. 注意事项总结

  8. 扩展思考

  9. 总结


1. 前言

在虚拟仿真实验中,同一个实验对象可能会有 多种行为算法,例如:

  • 水加热可以有慢加热、快速加热、微波加热等不同策略

  • 药剂混合可能有不同混合公式

  • 仪器测量可能有不同精度模式

如果用大量 if-else 或 switch 选择算法,会导致代码难以扩展。

策略模式(Strategy Pattern) 能将算法封装成独立类,在运行时灵活切换。


2. 什么是策略模式

策略模式:定义一系列算法,把每个算法封装起来,并使它们可互换,策略模式让算法独立于使用它的客户端变化。

优点

  • 算法独立,易扩展

  • 客户端无需知道具体实现

  • 可动态切换行为


3. 案例背景:虚拟仿真实验中的加热策略

  • 实验对象:水壶

  • 加热策略:

    1. SlowHeating:慢速升温

    2. FastHeating:快速升温

    3. MicrowaveHeating:微波加热

  • 用户可选择加热策略,水温变化逻辑由策略决定


4. 案例效果图(示意)

[慢速加热按钮] → 水温缓慢升高
[快速加热按钮] → 水温快速升高
[微波加热按钮] → 水温瞬间升高

5. 代码实现

5.1 策略接口:IHeatingStrategy

public interface IHeatingStrategy
{float Heat(float currentTemperature, float deltaTime);
}

5.2 具体策略类

慢速加热

using UnityEngine;
public class SlowHeating : IHeatingStrategy
{public float Heat(float currentTemperature, float deltaTime){return currentTemperature + 5f * deltaTime; // 每秒升温5℃}
}

快速加热

using UnityEngine;
public class FastHeating : IHeatingStrategy
{public float Heat(float currentTemperature, float deltaTime){return currentTemperature + 15f * deltaTime; // 每秒升温15℃}
}

微波加热

using UnityEngine;
public class MicrowaveHeating : IHeatingStrategy
{public float Heat(float currentTemperature, float deltaTime){return currentTemperature + 50f * deltaTime; // 每秒升温50℃}
}

5.3 上下文类:WaterHeaterContext

using UnityEngine;
public class WaterHeaterContext : MonoBehaviour
{public float Temperature { get; private set; } = 20f;private IHeatingStrategy heatingStrategy;public void SetStrategy(IHeatingStrategy strategy){heatingStrategy = strategy;Debug.Log($"当前加热策略:{strategy.GetType().Name}");}private void Update(){if (heatingStrategy != null){Temperature = heatingStrategy.Heat(Temperature, Time.deltaTime);Debug.Log($"水温:{Temperature:F1}℃");}}
}

5.4 UI 控制:策略选择按钮

using UnityEngine;
using UnityEngine.UI;
public class HeatingUI : MonoBehaviour
{[SerializeField] private Button slowButton;[SerializeField] private Button fastButton;[SerializeField] private Button microwaveButton;[SerializeField] private WaterHeaterContext waterHeater;private void Start(){slowButton.onClick.AddListener(() =>waterHeater.SetStrategy(new SlowHeating()));fastButton.onClick.AddListener(() =>waterHeater.SetStrategy(new FastHeating()));microwaveButton.onClick.AddListener(() =>waterHeater.SetStrategy(new MicrowaveHeating()));}
}

6. 运行流程

  1. 初始水温 20℃

  2. 玩家点击策略按钮 → 设置不同加热策略

  3. Update() 调用策略类的 Heat() 方法计算温度

  4. UI 或日志显示实时温度

  5. 可随时切换策略 → 水温变化行为动态改变


7. 注意事项总结

  • 策略类单一职责:每个策略只关心自己的计算逻辑

  • 上下文类只调用策略方法,不包含具体算法

  • 动态切换策略:通过 SetStrategy() 灵活切换


8. 扩展思考

  • 可以结合 观察者模式,策略变化通知 UI/日志

  • 可以结合 状态模式,根据温度切换 Idle / Heating / Boiling

  • 可以做 策略组合,如混合加热策略(慢+微波)


9. 总结

通过这个虚拟仿真案例,你学会了:

  • 使用 策略模式 动态切换实验对象行为

  • 将算法封装成独立类,易于维护与扩展

  • 与状态模式、观察者模式结合,可构建完整实验仿真框架

策略模式在虚拟实验中非常适合多行为、多算法选择的场景,让实验逻辑清晰且易于扩展。

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

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

相关文章

vue2:v-if和v-show的区别以及造成的影响

<div class="form-box-4" v-show="checkedList.includes(0505)"><span class="form-box-4-label"><span style="color: red">*</span>三失一偏类型:…

P6845 题解

P6845 他是一个带修改的直径,直径就是两点间最长距离,很容易想到用差分,\(dis_x\) 表示 \(x\) 到根节点的距离 \(dis_x + dis_y - 2dis_{lca(x,y)}\) 去求,先抛开这个 \(lca\) , 修改一条边相当于修改这个边所对应…

office2024绿色精简版

一、简介 首先需要说明的是,目前的安装方法只适合Windows10、11,并且只支持64位的操作系统,这点需要大家注意。大家下载压缩包解压后,在文件夹中会得到三个运行程序,分别是dll修复程序、和office残余文件彻底清理…

51单片机实践之数码管电子时钟/时间呈现及其设置

51单片机实践之数码管电子时钟/时间呈现及其设置pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

LGP3694 邦邦的大合唱站队 学习笔记

LGP3694 邦邦的大合唱站队 学习笔记 \(\texttt{Luogu Link}\) 前言 状压热身题。\(\texttt{Warm up!}\) 另外,你知道吗,设定上,邦邦已经火了…… 题意简述 \(n\) 个偶像排成一列,他们来自 \(m\) 个不同的乐队。每个…

2025.10.22学习记录

2025.10.22课程总结 本次学习聚焦 设计规范、查询技术、高级功能 三大模块,目标是掌握从表结构设计到复杂数据查询的全流程能力,为后续数据分析、系统开发奠定基础。 范式理论 核心观点:范式是电商数据结构化的基础…

LeeCode_101对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1:输入:root = [1,2,2,3,4,4,3] 输出:true class Solution { public:bool isSameTree(TreeNode* p, TreeNode* q){if(p == nullptr || q == nullptr){retu…

TRAE 设计团队如何玩转 Vibe Coding(上)|高美感页面生成篇

资料来源:火山引擎-开发者社区本内容分为上下两篇,主要和大家分享 TRAE 设计团队基于 TRAE 工具的 Vibe Coding 探索实践,包括三类场景的搭建和价值收益的案例,帮助设计师探索如何通过 Vibe Coding 放大设计价值 /…

详细介绍:观察者模式(Observer Pattern)定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

详细介绍:观察者模式(Observer Pattern)定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。2025-10-22 19:58 tlnshuju 阅读(0) 评论(0) 收藏 举报pre …

LeeCode_226反转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1:输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] //法一: class Solution { public:TreeNode* invertTree(TreeNode* root){if(root =…

TRAE 设计团队如何玩转 Vibe Coding(下)|设计工具生成与提效篇

资料来源:火山引擎-开发者社区本内容分为上下两篇,主要和大家分享 TRAE 设计团队基于 TRAE 工具的 Vibe Coding 探索实践,包括三类场景的搭建和价值收益的案例,帮助设计师探索如何通过 Vibe Coding 放大设计价值 /…

衡量效率,质量,运维的效率指标

目录背景和价值一、效率类指标(一)开发效率(二)运维效率二、质量类指标(一)代码质量(二)产品质量(三)测试质量(四)运维质量参考资料 背景和价值 在IT团队中,衡量效率和质量的指标可从多个维度进行定义,以…

2025多校冲刺CSP模拟赛7 总结

比赛:2025多校冲刺CSP模拟赛7 日期:\(25.10.22\),场地:\(\text{accoder}\),排名:\(56/73\)! 估分:\(30+0+[80,100]+0=110\) 终分:\(30+0+80+0=110\) 应该得分:\(100+100+[80,100]+?=280\) 失分 比赛决策问题…

详细介绍:wpf之 Popup

详细介绍:wpf之 Popuppre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…

? #4

100 + 60 + 50 + 100 = 310, Rank 1/6.怎么 swap(min(B,C),D) /wx2024暑期CSP-S&NOIP模拟赛第2套 链接:link 题解:link 的题解区 时间:4h (2025.10.22 14:00~18:00) 题目数:4 难度:A B C D\(\color{#F39C11} …

结对项目-生成四则运算

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13479姓名 学号 GitHu…

CSS3 超实用属性:pointer-events (可穿透图层的鼠标事件)

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣 CSS3 pointer-events 属性:实现可穿透图层的鼠标事件 在网页开发中,我们通常会遇到多个元素重叠的情况。在这种情况下,如何使得被遮挡的元素仍然能够响应鼠标…

C++开源库使用:nlohmann/json - 指南

C++开源库使用:nlohmann/json - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

实用指南:JAVA学习-预科部分(路线、博客、预备基础)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …