关于MVC的简单理解

研究了好久关于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架构代码就这么多,所以说比较简单啊=。=,然后就是事件的注册和调用了,有兴趣的可以自己试着写下,我就不写例子了,最好把事件统一管理起来,不然找的时候很麻烦的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值