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. 总结

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

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

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

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

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

相关推荐
PaoloBanchero2 小时前
Unity 虚拟仿真实验中设计模式的使用 —— 观察者模式(Observer Pattern)
观察者模式·unity·设计模式
Mr_WangAndy2 小时前
C++设计模式_创建型模式_单件模式
c++·单例模式·设计模式
笨手笨脚の2 小时前
设计模式-享元模式
设计模式·享元模式·结构型设计模式·设计模式之美
风语者日志2 小时前
创作者模式—单例设计模式
设计模式
舒克起飞了2 小时前
设计模式——单例模式
java·单例模式·设计模式
大飞pkz2 小时前
【设计模式】享元模式
开发语言·设计模式·c#·享元模式
软件黑马王子4 小时前
2025Unity超详细《坦克大战3D》项目实战案例(上篇)——UI搭建并使用和数据持久化(附资源和源代码)
游戏·ui·unity·c#
phdsky12 小时前
【设计模式】策略模式
设计模式·策略模式
烛阴12 小时前
【TS 设计模式完全指南】构建你的专属“通知中心”:深入观察者模式
javascript·设计模式·typescript