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

缺点

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

适用于

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

相关推荐
笨鸟先飞的橘猫6 小时前
skynet热更新实现问题与排错记录
学习·lua·skynet
andrsted6 小时前
练题簿在线免费刷题:将资料、Word 和 PDF导入小程序练习
学习·微信小程序·小程序·pdf·word·学习方法
新手小新6 小时前
通信工程师学习笔记5-通信系统
笔记·学习
我命由我123456 小时前
刚性防水与柔性防水
学习·职场和发展·产品运营·求职招聘·职场发展·学习方法·产品
dtq04246 小时前
C++3 - 分支语句if和string变量
开发语言·c++·学习
承渊政道6 小时前
Linux网络学习【深入理解应用层HTTP协议、Cookie与Session机制及HTTPS协议原理】
linux·网络·学习·http·cookie·session
LuminousCPP6 小时前
数据库学习笔记(二):MySQL 基础操作入门|在 CentOS Stream 10 上连接、建库与建表
数据库·经验分享·笔记·学习·mysql·centos
艾莉丝努力练剑7 小时前
【AI大模型接入SDK】ChatServer接口实现
c++·人工智能·学习·ai·架构·大模型·sdk
lhh_qrsly10 小时前
HTTP / HTTPS / MQTT / MQTTs(嵌入式学习版)
学习·http·https
xier_ran1 天前
【infra之路】AI 编译器学习笔记(十三):AI 编译器全景——TVM、XLA、IREE 与其他
人工智能·笔记·学习