• 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);
        }
        
    }

  • 相关阅读:
    leetcode 33. Search in Rotated Sorted Array
    leetcode 32. Longest Valid Parentheses
    leetcode 28. Implement strStr()
    leetcode 27. Remove Element
    leetcode 26. Remove Duplicates from Sorted Array
    leetcode 24. Swap Nodes in Pairs
    leetcode 22. Generate Parentheses
    树莓派的频率管理和热控制
    sql执行insert插入一条记录同时获取刚插入的id
    全程直播个人博客重构过程,采用springboot+dubbo+jpa技术栈。
  • 原文地址:https://www.cnblogs.com/ningyongbin/p/5953887.html
Copyright © 2020-2023  润新知