MVC设计模式

Model基类:

using UnityEngine;
using System.Collections;

/// <summary>
/// Model,数据类型基类,永久存在
/// </summary>
public  abstract class Model  {
    //名字
    public abstract string Name { get; }
    //发送通知
    public void SendEvent(string eventName, object args = null)
    {
        PureMVC.SendEvement(eventName, args);
    }
}

View基类:

using UnityEngine;
using System.Collections;

/// <summary>
/// View,视图基类 永久存在
/// </summary>
public abstract class View : MonoBehaviour {
    //名字
    public abstract string Name { get; }
    //获取模型
    public T GetModel<T>() where T:Model
    {
        return null;
    }
    //发送通知
    public void SendEvent(string eventName, object args = null)
    {
        PureMVC.SendEvement(eventName, args);
    }
}

Controller基类:

using UnityEngine;
using System.Collections;

/// <summary>
/// 控制器  使用完之后销毁
/// </summary>
public abstract class Controller
{
    //名字
    public abstract string Name { get; }
    //获取模型
    public T GetModel<T>() where T : Model
    {
        return PureMVC.GetModel<T>();
    }
    //获取视图
    public T GetView<T>() where T : View
    {
        return PureMVC.GetView<T>();
    }
    //控制器执行逻辑代码
    public abstract void Execute(object args);         
}

总控制器PureMVC类

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

/// <summary>
/// mvc 的总控制器
/// </summary>
public static class PureMVC  {
    private static Dictionary<string, Model> models = new Dictionary<string, Model>();
    private static Dictionary<string, View> views = new Dictionary<string, View>();
    private static Dictionary<string, Type> ctrls = new Dictionary<string, Type>();

    //向models集合里面加model这个元素(注册其实就是向集合里面添加元素)
    public static void RegisterModel(Model model)
    {
        models[model.Name] = model;
    }
    //向views集合里面加入view这个元素(注册其实就是向集合里面添加相应元素)
    public static void Registerview(View view)
    {
        views[view.name] = view;
    }
    //向控制器类型里面加入相应的类型
    public static void RegisterCtrl(string name, Type type)
    {
        ctrls[name] = type;
    }
    //从models集合里获取指定类型(T)模型
    public static T GetModel<T>() where T : Model
    {
        foreach (Model m in models.Values)
        {
            if (m is T)
            {
                return m as T;
            }         
        }
        return null;
    }
    //从views集合获取指定类型(T)视图
    public static T GetView<T>() where T : View
    {
        foreach (View m in views.Values)
        {
            if (m is T)
            {
                return m as T;
            }
        }
        return null;
    }
    //发送事件函数,根据传进来的控制器的名字获取相应类型的控制器
    public static void SendEvement(string evementName, object args=null)
    {
        //如果集合包含对应名字类型的控制器
        if (ctrls.ContainsKey(evementName))
        {
            //拿到控制器队形
            Type ctrlType = ctrls[evementName];
            //使用反射实例化控制器队形(创建一个ctrlType类型的实例,并且将其强转为Controller类型)
            Controller ctrl = (Controller)Activator.CreateInstance(ctrlType);
            //执行命令
            ctrl.Execute(args);
        }
    }
}

开始游戏控制器类:

using UnityEngine;
using System.Collections;
using System;

public class StartGameController : Controller
{
    public override string Name
    {
        get
        {
            //throw new NotImplementedException();
            return (Consts.E_StartGame);
        }
    }
    public override void Execute(object args)
    {
        //获取模型
        //获取视图
        //获取逻辑代码
        Debug.Log("执行游戏开始逻辑代码");
    }
}

常量类:

using UnityEngine;
using System.Collections;

public class Consts  {
    public const string E_StartGame = "StartGameController";    
}

测试脚本类:

using UnityEngine;
using System.Collections;

public class GameTest : MonoBehaviour {    
    void Start ()
    {
        //注册事件
        PureMVC.RegisterCtrl(Consts.E_StartGame, typeof(StartGameController));
        //发送事件
        PureMVC.SendEvement(Consts.E_StartGame);
    }
    
}

原文地址:https://www.cnblogs.com/ningyongbin/p/5953887.html