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语句,区分不同的数据类

缺点

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

适用于

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

相关推荐
龙文浩_1 天前
Attention Mechanism: From Theory to Code
人工智能·深度学习·神经网络·学习·自然语言处理
aqiu~1 天前
VSCode编辑器用于Unity项目
vscode·unity
爱上好庆祝1 天前
svg图片
前端·css·学习·html·css3
嵌入式小企鹅1 天前
蓝牙学习系列(八):BLE L2CAP 协议详解
网络·学习·蓝牙·ble·协议栈·l2cap
jiayong231 天前
第 8 课:开始引入组合式函数
前端·javascript·学习
格鸰爱童话1 天前
向AI学习项目技能(五)
java·学习
技术人生黄勇1 天前
拆解 Hermes Agent:开源 Agent 里唯一的闭环学习系统
学习
凉、介1 天前
别再把 PCIe 的 inbound/outbound、iATU 和 eDMA 混为一谈
linux·笔记·学习·嵌入式·pcie
speop1 天前
TASK01 | Reasoning Kindom
学习
2301_822703201 天前
鸿蒙flutter三方库实战——教育与学习平台:Flutter Markdown
学习·算法·flutter·华为·harmonyos·鸿蒙