研究了好久关于MVC,虽然还是一知半解的,但是先记录下比较简单的吧,我相信一些小白认真看看应该也是可以看懂的。
先解释下MVC,什么是MVC呢,我就直接从百度百科找了:
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:
-
Model(模型)表示应用程序核心(比如数据库记录列表)。
-
View(视图)显示数据(数据库记录)。
-
Controller(控制器)处理输入(写入数据库记录)。
MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
在下MVC的结构,这个就是从百度上找到的一个图,很清楚的说明了MVC这三者之间的关系。
图中实线就是可以进行方法调用,对于下图来说,就是试图可以调用模型,控制器可以调用视图和模型
图中虚线就是发送一个事件差不多,通知做出相应的改变。例如当模型发生改变的时候,发送一个事件搞死视图,视图可以做出相应的变化。
最后就是代码了,首先要先建立M、V、C三个脚本了
View
public abstract class View : MonoBehaviour {
//名字标识
public abstract string Name { get; }
//关心的事件列表
[HideInInspector]
public List<string> AttentionList = new List<string>();
public virtual void RegisterAttentionEvent() { }
//可以处理很多的事件,所以要加个名字
public abstract void HandleEvent(string name,object data);
//发送事件
protected void SendEvent(string eventName,object data = null)
{
MVC.SendEvent(eventName, data);
}
//获取模型
protected Model GetModel<T>() where T : Model
{
return MVC.GetModel<T>() as T;
}
}
Model
public abstract class Model {
//名字标识
public abstract string Name { get; }
//发送事件
protected void SendEvent(string eventName,object data = null)
{
MVC.SendEvent(eventName, data);
}
}
Controller
public abstract class Controller {
//执行
public abstract void Execute(object data);
//获取模型
protected Model GetModel<T>() where T : Model
{
return MVC.GetModel<T>() as T;
}
//获取视图
protected View GetView<T>() where T : View
{
return MVC.GetView<T>() as T;
}
//注册
protected void RegisterModel(Model model)
{
MVC.RegisterModel(model);
}
protected void RegisterView(View view)
{
MVC.RegisterView(view);
}
protected void RegisterController(string eventName,Type controllerType)
{
MVC.RegisterController(eventName,controllerType);
}
}
然后就是把这三者联系起来的一个MVC脚本
MVC
public static class MVC {
//资源
public static Dictionary<string, Model> Models = new Dictionary<string, Model>();//string 为名字
public static Dictionary<string, View> Views = new Dictionary<string, View>();//string 为名字
//controller存储的是一个类型,而不是controller类的一个实例
public static Dictionary<string, Type> CommandMap = new Dictionary<string, Type>(); //string为事件的名字
//注册资源
public static void RegisterView(View view)
{
//防止view的重复注册
if (Views.ContainsKey(view.Name))
{
Views.Remove(view.Name);
}
view.RegisterAttentionEvent();
Views[view.Name] = view;
}
public static void RegisterModel(Model model)
{
Models[model.Name] = model;
}
public static void RegisterController(string eventName,Type controllerType)
{
CommandMap[eventName] = controllerType;
}
//获取model
public static T GetModel<T>() where T:Model
{
foreach (var m in Models.Values)
{
if(m is T)
{
return (T)m;
}
}
return null;
}
//获取view
public static T GetView<T>() where T : View
{
foreach (var v in Views.Values)
{
if (v is T)
{
return (T)v;
}
}
return null;
}
//发送事件
public static void SendEvent(string eventName,object data = null)
{
//controller执行,一个c处理一个事件
if (CommandMap.ContainsKey(eventName))
{
Type t = CommandMap[eventName];
//控制器生成
Controller c = Activator.CreateInstance(t) as Controller;
c.Execute(data);
}
//View处理,一个v可以处理很多事件
foreach (var v in Views.Values)
{
if (v.AttentionList.Contains(eventName))
{
v.HandleEvent(eventName,data);
}
}
}
}
基本的MVC架构代码就这么多,所以说比较简单啊=。=,然后就是事件的注册和调用了,有兴趣的可以自己试着写下,我就不写例子了,最好把事件统一管理起来,不然找的时候很麻烦的。