📖 目录
-
前言
-
什么是策略模式
-
案例背景:虚拟仿真实验中的加热策略
-
案例效果图(示意)
-
代码实现
-
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. 案例效果图(示意)
css
[慢速加热按钮] → 水温缓慢升高
[快速加热按钮] → 水温快速升高
[微波加热按钮] → 水温瞬间升高
5. 代码实现
5.1 策略接口:IHeatingStrategy
cs
public interface IHeatingStrategy
{
float Heat(float currentTemperature, float deltaTime);
}
5.2 具体策略类
慢速加热
cs
using UnityEngine;
public class SlowHeating : IHeatingStrategy
{
public float Heat(float currentTemperature, float deltaTime)
{
return currentTemperature + 5f * deltaTime; // 每秒升温5℃
}
}
快速加热
cs
using UnityEngine;
public class FastHeating : IHeatingStrategy
{
public float Heat(float currentTemperature, float deltaTime)
{
return currentTemperature + 15f * deltaTime; // 每秒升温15℃
}
}
微波加热
cs
using UnityEngine;
public class MicrowaveHeating : IHeatingStrategy
{
public float Heat(float currentTemperature, float deltaTime)
{
return currentTemperature + 50f * deltaTime; // 每秒升温50℃
}
}
5.3 上下文类:WaterHeaterContext
cs
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 控制:策略选择按钮
cs
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. 总结
通过这个虚拟仿真案例,你学会了:
-
使用 策略模式 动态切换实验对象行为
-
将算法封装成独立类,易于维护与扩展
-
与状态模式、观察者模式结合,可构建完整实验仿真框架
👉 策略模式在虚拟实验中非常适合多行为、多算法选择的场景,让实验逻辑清晰且易于扩展。