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
}
有需要学习视频的欢迎关注微信公众号