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

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

目录

  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.jsqmd.com/news/19768/

相关文章:

  • vue2:v-if和v-show的区别以及造成的影响
  • P6845 题解
  • office2024绿色精简版
  • 51单片机实践之数码管电子时钟/时间呈现及其设置
  • LGP3694 邦邦的大合唱站队 学习笔记
  • 2025.10.22学习记录
  • LeeCode_101对称二叉树
  • TRAE 设计团队如何玩转 Vibe Coding(上)|高美感页面生成篇
  • 详细介绍:观察者模式(Observer Pattern)定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
  • LeeCode_226反转二叉树
  • picture
  • 详细介绍:wpf之 Popup
  • ? #4
  • 结对项目-生成四则运算
  • CSS3 超实用属性:pointer-events (可穿透图层的鼠标事件)
  • C++开源库使用:nlohmann/json - 指南
  • 实用指南:JAVA学习-预科部分(路线、博客、预备基础)
  • 【比赛记录】2025CSP+NOIP 冲刺模拟赛合集Ⅱ
  • 取证-windbg和dmp,以及文件分析基本流程
  • 20232422 2025-2026-1 《网络与系统攻防技术》实验二实验报告
  • 羊驼二次免疫的六大风险:纳米抗体制备不可忽视的 “隐形陷阱”
  • 深入解析:线性代数 SVD | 令人困扰的精度 1
  • 完整教程:C++项目:仿muduo库高并发服务器-------connection模块
  • 营销数字化专家要求
  • 小程序反编译包的架构文件
  • 【最终章】-串口收发指令处理器-Verilog语法学习EP12 - 教程
  • 10.22 CSP-S模拟37/2025多校冲刺CSP模拟赛7 改题记录
  • 完整教程:LeapMotion_Demo演示
  • [题解]P11126 [ROIR 2024] 三等分的数组 (Day 2)
  • Acrobat Pro DC 2025下载及破解安装教程,附永久免费免激活中文版Acrobat Pro DC安装包(稳定版)