找回密码
 立即注册
查看: 356|回复: 0

[笔记] 基于Unity3D框架设计-PureMVC

[复制链接]
发表于 2021-11-27 14:39 | 显示全部楼层 |阅读模式
大家好,我是爱敲代码的三叶。
今天闲来无事,写了一些底层的框架设计。感兴趣的可以点赞收藏~
言归正传,今天聊聊架构设计,什么是架构设计呢?官方的说法就是:架构设计是人们对一个结构内的元素及元素间关系的一种主观映射的产物。架构设计是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。这里就可以引出我们今天所说的MVC框架了,MVC(model,view,controller)的缩写,就是模型,视图,控制器。视图其实就是就是unity里面的UGUI,模型就是数据,控制器其实就是介于模型和视图的之前的一层媒介,用于及时更新视图和模型的桥梁。MVC设计其实是比较经典的框架设计,但是由于其上手有一点的难度,可能对一些新手不是很友好,又因为其底层逻辑,一般很难理解。下面直接上一个mvc的设计图,看图其实是比较容易一些的。


如果对mvc有了解的,这个图是比较直观的,之间的关系也是很清晰。这里插一下工作中的会不会用到这些,其实是肯定的,这个在开发者身上应该说是比较常用的,每个公司都会有自己的一套架构,用于日常开发使用,这些框架如果你仔细阅读,你会发现其实还是mvc的一种演变。所以把mvc这种设计的思想掌握之后,再去看别的一些架构,会让你上手的更快一些。
今天附上的的pureMVC其实就是在mvc上新增了一层,代码我都备注了,不理解的可以多看看。这里谈一下为什么要用架构去开发程序,可能对一些新手来说,照着需求写代码就完事了,其实不然的,如果你的项目很小,一次性的,那是可以直接写的,毕竟都是你自己看的,但是如果稍微大一点的项目,你再去按照自己的想法去写,没有一定的约束,其实这是给自己找加班,项目遇到扩展,bug频出的时候,你就知道当初写的有多开心,现在就有多痛苦。如果你的项目按照一定的规则,就如使用一定的架构,条理清晰,你会感谢自己的。
好了,接来下我来示例代码:
namespace SYFrameworkDesign
{
        public abstract class SY_View : MonoBehaviour
        {
                public abstract string Name { get; }

                /// <summary>
                /// 处理发送的消息
                /// </summary>
                /// <param name="name"></param>
                /// <param name="data"></param>
                public virtual void SendNotification(string  name,object data = null)
                {
                        SY_PureMVC.SendSmg(name, data);
                }

                /// <summary>
                /// 获得model
                /// </summary>
                /// <typeparam name="T"></typeparam>
                /// <param name="name"></param>
                /// <returns></returns>
                public T GetModel<T>(string  name) where T : SY_Model
                {
                        return SY_PureMVC.GetModel<T>(name);       
                }

                /// <summary>
                /// 保存视图感兴趣的通知
                /// </summary>
                protected List<string> InterestNotification = new List<string>();

                public bool ContainNotification(string name)
                {
                        return InterestNotification.Contains(name);
                }

                /// <summary>
                /// 注册试图之后执行的方法
                /// </summary>
                public virtual void AddInteresNotification()
                {

                }

                /// <summary>
                /// 处理model 中的事件
                /// </summary>
                /// <param name="name"></param>
                /// <param name="data"></param>
                public virtual void HandleNotification(string name,object data = null)
                {

                }

        }

}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
namespace SYFrameworkDesign
{
        public abstract class SY_Controller
        {

                public abstract void Execute(object data = null);

                /// <summary>
                /// 获得model
                /// </summary>
                /// <typeparam name="T"></typeparam>
                /// <param name="name"></param>
                /// <returns></returns>
                public T GetModel<T>(string name) where T:SY_Model
                {
                        return SY_PureMVC.GetModel<T>(name);
                }
                /// <summary>
                /// 获得视图
                /// </summary>
                /// <typeparam name="T"></typeparam>
                /// <param name="name"></param>
                /// <returns></returns>
                public T GetView<T>(string name) where T : SY_View
                {
                        return SY_PureMVC.GetView<T>(name) ;
                }


                /// <summary>
                /// 注册model
                /// </summary>
                /// <param name="sY_Model"></param>
                public void RegisterMode(SY_Model sY_Model)
                {
                        SY_PureMVC.RegisterModel(sY_Model);
                }

                /// <summary>
                /// 注册view
                /// </summary>
                /// <param name="sY_View"></param>
                public void RegisterView(SY_View sY_View)
                {
                        SY_PureMVC.RegisterView(sY_View);
                }


                /// <summary>
                /// 注册命令
                /// </summary>
                /// <param name="name"></param>
                /// <param name="type"></param>
                public void RegisterCommand(string name,Type type)
                {
                        SY_PureMVC.RegisterCommand(name, type);
                }
        }

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

namespace SYFrameworkDesign
{
        public abstract class SY_Model
        {
                /// <summary>
                /// model 名字
                /// </summary>
                public abstract string Name { get; }

                /// <summary>
                /// 发送通知
                /// </summary>
                /// <param name="name"></param>
                /// <param name="data"></param>
                public virtual void SendNotification(string name,object data = null)
                {
                        SY_PureMVC.SendSmg(name, data);
                }
        }

}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
namespace SYFrameworkDesign
{
        /// <summary>
        /// PureMVC
        /// </summary>
        public class SY_PureMVC
        {
                private static Dictionary<string, SY_Model> Models = new Dictionary<string, SY_Model>();

                private static Dictionary<string, SY_View> Views = new Dictionary<string, SY_View>();


                private static Dictionary<string, Type> Commands = new Dictionary<string, Type>();
                /// <summary>
                /// 注册model
                /// </summary>
                /// <param name="sY_Model"></param>
                public static void RegisterModel(SY_Model sY_Model)
                {
                        if (!Models.ContainsKey(sY_Model.Name))
                        {
                                Models.Add(sY_Model.Name, sY_Model);
                        }
                }

                /// <summary>
                /// 移除model
                /// </summary>
                /// <param name="sY_Model"></param>
                public static void UnRegisterModel(SY_Model sY_Model)
                {
                        if (Models.ContainsKey(sY_Model.Name))
                        {
                                Models.Remove(sY_Model.Name);
                        }
                }

                /// <summary>
                /// 注册View
                /// </summary>
                /// <param name="sY_View"></param>
                public static void RegisterView(SY_View sY_View)
                {
                        if (!Views.ContainsKey(sY_View.Name))
                        {
                                Views.Add(sY_View.Name, sY_View)
;                        }
                }

                public static void UnRegisterView(SY_View sY_View)
                {
                        if (Views.ContainsKey(sY_View.Name))
                        {
                                Views.Remove(sY_View.Name);
                        }
                }

                /// <summary>
                /// 获得model
                /// </summary>
                /// <typeparam name="T"></typeparam>
                /// <param name="name"></param>
                /// <returns></returns>
                public static T GetModel<T>(string name) where T : SY_Model
                {
                        foreach (var item in Models.Keys)
                        {
                                if (item.Equals(name))
                                {
                                        return Models[name] as T;
                                }
                        }
                        return null;
                }

                /// <summary>
                /// 获得view
                /// </summary>
                /// <typeparam name="T"></typeparam>
                /// <param name="name"></param>
                /// <returns></returns>
                public static T GetView<T>(string name) where T : SY_View
                {
                        foreach (var item in Views.Keys)
                        {
                                if (item.Equals(name))
                                {
                                        return Views[name] as T;
                                }
                        }

                        return null;
                }

                /// <summary>
                /// 注册命令
                /// </summary>
                /// <param name="name"></param>
                /// <param name="type"></param>
                public static void RegisterCommand(string name,Type type)
                {
                        if (!Commands.ContainsKey(name))
                        {
                                Commands.Add(name, type);
                        }
                }

                /// <summary>
                /// 移除命令
                /// </summary>
                /// <param name="name"></param>
                public static void UnRegisterCommand(string name)
                {
                        if (Commands.ContainsKey(name))
                        {
                                Commands.Remove(name);
                        }
                }

                /// <summary>
                /// 处理消息
                /// </summary>
                /// <param name="name"></param>
                /// <param name="data"></param>
                public static void SendSmg(string name,object data=null)
                {
                        if (Commands.ContainsKey(name))
                        {
                                SY_Controller command = Activator.CreateInstance(Commands[name]) as SY_Controller;
                                command.Execute();
                               

                        }

                        //处理视图
                        foreach (SY_View item in Views.Values)
                        {
                                if (item.ContainNotification(name))
                                {
                                        item.HandleNotification(name, data);
                                }
                        }
                }

                /// <summary>
                /// 置null
                /// </summary>
                public static void RemoveAll()
                {
                        Models.Clear();
                        Models = null;

                        Views.Clear();
                        Views = null;

                        Commands.Clear();
                        Commands = null;
                }
        }

}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-11 01:36 , Processed in 0.280374 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表