萌熊跑酷(三)MVC的搭建

MVC图解:

在这里插入图片描述

Model:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class Model 
{
    /// <summary>
    /// 名字标识,根据名字来查找Model
    /// 每个Model有不同的名字
    /// 通过名字存储到内存中
    /// </summary>
    public abstract string Name { get; }

    /// <summary>
    /// 发送事件
    /// </summary>
    /// <param name="eventName"></param>
    /// <param name="data"></param>
    protected void SendEvent(string eventName,object data=null)
    {
        MVC.SendEvent(eventName,data);
    }
}

View类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class View : MonoBehaviour
{
    /// <summary>
    /// 名字标识,根据名字来查找Model
    /// 每个Model有不同的名字
    /// 通过名字存储到内存中
    /// </summary>
    public abstract string Name { get; }

    [HideInInspector]
    /// <summary>
    /// 关心事件的列表, 储存所有可以处理的事件名字
    /// </summary>
    public List<string> attentionList = new List<string>();

    /// <summary>
    /// 注册关心事件的方法
    /// </summary>
    public virtual void RegisterAttentionEvenr()
    {

    }

    /// <summary>
    /// 收到事件后执行的方法
    /// </summary>
    /// <param name="name"></param>
    /// <param name="data"></param>
    public abstract void HandleEvent(string name, object data = null);

    /// <summary>
    /// 发送事件
    /// </summary>
    /// <param name="eventName"></param>
    /// <param name="data"></param>
    protected void SendEvent(string eventName, object data = null)
    {
        MVC.SendEvent(eventName, data);
    }
    /// <summary>
    /// 获取Model
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    protected T GetModel<T>()
        where T : Model
    {
        return MVC.GetModel<T>() as T;
    }
}

Controller类

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class Controller 
{
    /// <summary>
    /// 接收到事件以后,执行的方法
    /// </summary>
    /// <param name="data"></param>
    public abstract void Execute(object data);


    /// <summary>
    /// 获取Model
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    protected T GetModel<T>()
        where T : Model
    {
        return MVC.GetModel<T>() as T;
    }

    /// <summary>
    /// 获取View
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    protected T GetView<T>()
        where T : View
    {
        return MVC.GetView<T>() as T;
    }
    //注册View
    protected void RegisterView(View view)
    {
        MVC.RegisterView(view);
    }
    //注册Model
    protected void RegisterModel(Model model)
    {
        MVC.RegsieterModel(model);
    }
    //注册Controller
    protected void RegisterController(string eventName,Type controllerType)
    {
        MVC.RegsieterController(eventName,controllerType);
    }
}

MVC中间类:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 第三方管理类
/// </summary>
public static class MVC
{
    /// <summary>
    ///存储所有的model
    ///name:为Model里的name
    /// </summary>
    public static Dictionary<string, Model> Models = new Dictionary<string, Model>();
    /// <summary>
    ///存储所有的View
    ///name:为View里的name
    /// </summary>
    public static Dictionary<string, View> Views = new Dictionary<string, View>();
    /// <summary>
    /// 存储所有的controller,根据类型存储控制器
    /// string:事件名字
    /// type:类型
    /// </summary>
    public static Dictionary<string, Type> CommandMap = new Dictionary<string, Type>();

    #region 注册MVC

    /// <summary>
    /// 注册View
    /// </summary>
    /// <param name="view">需要注册的View</param>
    public static void RegisterView(View view)
    {
        //防止View的重复注册
        if (Views.ContainsKey(view.Name))
        {
            Views.Remove(view.Name);
        }

        view.RegisterAttentionEvenr();
        Views[view.Name] = view;

    }
    /// <summary>
    /// 注册Model
    /// </summary>
    /// <param name="model"></param>
    public static void RegsieterModel(Model model)
    {
        Models[model.Name] = model;
    
    }
    /// <summary>
    /// 注册Controller
    /// </summary>
    /// <param name="eventName">事件名字</param>
    /// <param name="controller">该事件名字对应的controller类型</param>
    public static void RegsieterController(string eventName, Type controller)
    {
        CommandMap[eventName] = controller;
    }


    #endregion

    #region 获取MVC

    /// <summary>
    /// 获取Model
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <returns></returns>
    public static T GetModel<T>()
        where T : Model
    {
        foreach (var item in Models.Values)
        {
            if (item is T)
            {
                return (T)item;
            }
        }
        return null;
    }

    /// <summary>
    /// 获取View
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <returns></returns>
    public static T GetView<T>()
        where T : View
    {
        foreach (var item in Views.Values)
        {
            if (item is T)
            {
                return (T)item;
            }
        }
        return null;
    }
    #endregion

    #region  发送事件

    public static void SendEvent(string eventName,object data=null)
    {
        //控制器处理 一个事件对应一个Controller
        if (CommandMap.ContainsKey(eventName))
        {
            Type t = CommandMap[eventName];
            //Activator.CreateInstance(t) 根据一个类型进行动态创建 Activator反射类
            Controller c = Activator.CreateInstance(t) as Controller;
            c.Execute(data);
        }

        //View处理 一个View会处理很多个事件

        foreach (var item in Views.Values)
        {
            if (item.attentionList.Contains(eventName))
            {
                item.HandleEvent(eventName,data);
            }
        }
    }

    #endregion
}


有需要学习视频的欢迎关注微信公众号

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值