Unity通过ScriptableObject学习访问者模式

数据类

抽象数据类,定义一个Accept方法,通过该方法使用子类数据,传入不同的visitor可以有多种多样的数据使用方式

csharp 复制代码
using UnityEngine;
public abstract class BaseDataSO : ScriptableObject
{
    public abstract void Accept(IDataVisitor visitor);
}

文本数据类,重写Accept方法,调用接口的Visit方法,并将自身作为参数传入

csharp 复制代码
using UnityEngine;
public class TextDataSO : BaseDataSO
{
    [Header("文本")]
    [TextArea(3, 20)]
    [SerializeField] string text;
    public string Content => text;
    public override void Accept(IDataVisitor visitor)
    {
        visitor.Visit(this);
    }
}

图片数据类,重写Accept方法,调用接口的Visit方法,并将自身作为参数传入

csharp 复制代码
using UnityEngine;
public class ImageDataSO : BaseDataSO
{
    [Header("图片")]
    [SerializeField] Sprite image;
    public Sprite Content => image;
    public override void Accept(IDataVisitor visitor)
    {
        visitor.Visit(this);
    }
}

使用数据接口,利用函数重载机制,数据类自动识别对应方法

csharp 复制代码
public interface IDataVisitor 
{
    void Visit(TextDataSO data);
    void Visit(ImageDataSO data);
}

使用数据类

csharp 复制代码
using UnityEngine;
public class DebugDataVisitor : IDataVisitor
{
    public void Visit(TextDataSO data)
    {
        Debug.Log("使用文本:" + data);
    }

    public void Visit(ImageDataSO data)
    {
        Debug.Log("使用图片: " + data);
    }
}

测试

csharp 复制代码
using UnityEngine;
public class DataTestMain : MonoBehaviour
{
    [SerializeField] BaseDataSO[] datas;
    private void Start()
    {
        DebugDataVisitor debugDataVisitor = new DebugDataVisitor();
        foreach (var item in datas)       
            item.Accept(debugDataVisitor);       
    }
}

优缺点

优点

  1. 数据和数据的使用方式分离,可轻松拓展不同的数据使用方式
  2. 不需要使用switch或者if语句,区分不同的数据类

缺点

添加新的数据类时,所有的数据使用类都需要更新

适用于

数据类型数目固定,操作方式多变。

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
weixin_424294674 天前
Unity 调用Steamworks API 的 SteamUserStats.RequestCurrentStats()报错
unity·游戏引擎·steamwork
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
HoFunGames4 天前
Unity小地图,Easy Minimap System MT-GPS插件
unity·游戏引擎
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习