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. 案例效果图(示意)

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. 运行流程

  1. 初始水温 20℃

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

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

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

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


7. 注意事项总结

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

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

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


8. 扩展思考

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

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

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


9. 总结

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

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

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

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

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

相关推荐
学嵌入式的小杨同学2 分钟前
顺序表(SqList)完整解析与实现(数据结构专栏版)
c++·算法·unity·游戏引擎·代理模式
老蒋每日coding20 分钟前
AI智能体设计模式系列(四)—— 反思模式
设计模式
sxlishaobin24 分钟前
设计模式之策略模式
设计模式·策略模式
程序猿多布38 分钟前
HybridCLR热更打包后AOT泛型函数实例化缺失处理
unity·hybridclr·aot generic
平行云2 小时前
实时云渲染支持数字孪生智能工厂:迈向“零原型”制造
人工智能·unity·ue5·云计算·webrtc·制造·实时云渲染
dzj20212 小时前
Unity中使用LLMUnity遇到的问题(一)
unity·llm·llmunity
DowneyJoy2 小时前
【Unity通用工具类】列表扩展方法ListExtensions
unity·c#·交互
极客柒2 小时前
Unity 大地图 高性能路径引导Shader
unity·游戏引擎
佛祖让我来巡山2 小时前
【面试题】什么是观察者模式?一般用在什么场景?
观察者模式·设计模式
Yu_Lijing2 小时前
基于C++的《Head First设计模式》笔记——适配器模式
c++·笔记·设计模式