Unity 虚拟仿真实验中设计模式的使用 ——策略模式(Strategy Pattern)
📖 目录
前言
什么是策略模式
案例背景:虚拟仿真实验中的加热策略
案例效果图(示意)
代码实现
5.1 策略接口:IHeatingStrategy
5.2 具体策略类:SlowHeating / FastHeating / MicrowaveHeating
5.3 上下文类:WaterHeaterContext
5.4 UI 控制:策略选择按钮
运行流程
注意事项总结
扩展思考
总结
1. 前言
在虚拟仿真实验中,同一个实验对象可能会有 多种行为算法,例如:
水加热可以有慢加热、快速加热、微波加热等不同策略
药剂混合可能有不同混合公式
仪器测量可能有不同精度模式
如果用大量 if-else 或 switch 选择算法,会导致代码难以扩展。
策略模式(Strategy Pattern) 能将算法封装成独立类,在运行时灵活切换。
2. 什么是策略模式
策略模式:定义一系列算法,把每个算法封装起来,并使它们可互换,策略模式让算法独立于使用它的客户端变化。
优点:
算法独立,易扩展
客户端无需知道具体实现
可动态切换行为
3. 案例背景:虚拟仿真实验中的加热策略
实验对象:水壶
加热策略:
SlowHeating:慢速升温
FastHeating:快速升温
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. 运行流程
初始水温 20℃
玩家点击策略按钮 → 设置不同加热策略
Update()
调用策略类的Heat()
方法计算温度UI 或日志显示实时温度
可随时切换策略 → 水温变化行为动态改变
7. 注意事项总结
策略类单一职责:每个策略只关心自己的计算逻辑
上下文类只调用策略方法,不包含具体算法
动态切换策略:通过
SetStrategy()
灵活切换
8. 扩展思考
可以结合 观察者模式,策略变化通知 UI/日志
可以结合 状态模式,根据温度切换 Idle / Heating / Boiling
可以做 策略组合,如混合加热策略(慢+微波)
9. 总结
通过这个虚拟仿真案例,你学会了:
使用 策略模式 动态切换实验对象行为
将算法封装成独立类,易于维护与扩展
与状态模式、观察者模式结合,可构建完整实验仿真框架
👉 策略模式在虚拟实验中非常适合多行为、多算法选择的场景,让实验逻辑清晰且易于扩展。