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

缺点

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

适用于

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

相关推荐
Slow菜鸟1 天前
AI学习篇(五) | awesome-design-md 使用说明
人工智能·学习
狐狐生风1 天前
LangChain 向量存储:Chroma、FAISS
人工智能·python·学习·langchain·faiss·agentai
狐狐生风1 天前
LangChain RAG 基础
人工智能·python·学习·langchain·rag·agentai
努力努力再努力FFF1 天前
医生对AI辅助诊断感兴趣,作为临床人员该怎么了解和学习?
人工智能·学习
sakiko_1 天前
UIKit学习笔记5-使用UITableView制作聊天页面
笔记·学习·swift·uikit
Alice-YUE1 天前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
北山有鸟1 天前
修改源码法和插件法
嵌入式硬件·学习
richxu202510011 天前
嵌入式学习之路->stm32篇->(14)通用定时器(上)
stm32·单片机·嵌入式硬件·学习
qeen871 天前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
lizhihai_991 天前
股市学习心得-六张分时保命图
大数据·人工智能·学习