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

缺点

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

适用于

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

相关推荐
Gorgous—l15 小时前
数据结构算法学习:LeetCode热题100-动态规划篇(下)(单词拆分、最长递增子序列、乘积最大子数组、分割等和子集、最长有效括号)
数据结构·学习·算法
窗边鸟17 小时前
小白日记之java方法(java复习)
java·学习
魔芋红茶17 小时前
Spring Security 学习笔记 4:用户/密码认证
笔记·学习·spring
爱宁~18 小时前
UnityShader学习笔记[二百九十九]UGUI中的Mask遮罩半透明Shader
笔记·学习
变身缎带19 小时前
Unity里基于Luban的buff系统
数据库·unity·游戏引擎
啦哈拉哈19 小时前
【Python】知识点零碎学习4
python·学习·算法
HyperAI超神经19 小时前
【vLLM 学习】Rlhf Utils
人工智能·深度学习·学习·机器学习·ai编程·vllm
P.H. Infinity19 小时前
【QLIB】三、学习层(一)
学习
茜子.Java20 小时前
分享一个输入 allure --version 报错解决方式
学习
AI视觉网奇21 小时前
ue c++ 编译常量
c++·学习·ue5