zoukankan      html  css  js  c++  java
  • 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);
        }
        
    }

  • 相关阅读:
    ThreadLocal总结
    zookeeper学习笔记
    安装solr
    VirtualBox安装Centos7
    Solr学习
    Redis缓存会出现的问题?
    面试题目总结
    mysql分库分表
    Java内存模型
    HashMap在多线程中循环链表问题(jdk1.7)
  • 原文地址:https://www.cnblogs.com/ningyongbin/p/5953887.html
Copyright © 2011-2022 走看看