数据类
抽象数据类,定义一个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);
}
}
优缺点
优点
- 数据和数据的使用方式分离,可轻松拓展不同的数据使用方式
- 不需要使用switch或者if语句,区分不同的数据类
缺点
添加新的数据类时,所有的数据使用类都需要更新
适用于
数据类型数目固定,操作方式多变。