一、基本思想
经典的MVC框架:
- Model(模型):管理数据
- View(视图):管理视图
- Controller(控制器):实现视图与数据之间传递消息

- Facade 管理 View、Controller、Model 三大类
- Model 管理 Proxy,其中每个Proxy可以负责单个或多个Obj的工作 (Obj与数据相关)
- View 管理 Mediator,其中每个Mediator可以负责单个或多个UI的工作 (UI与视图有关)
- Controller 负责 Command,实现UI与Obj(即视图与数据)之间的通讯
描述:存储IProxy
(中介者),以及对数据的增、删、查操作。
using System.Collections.Generic;
namespace PureMVC
{
///
/// 负责保存对Proxy对象的引用
///
public class Model:Singleton
{
///
/// 存储 Proxy
///
private Dictionary proxyMap;
private void Awake()
{
proxyMap = new Dictionary();
}
///
/// 注册 Proxy
///
/// 数据接口内容
public void RegisterProxy(IProxy proxy)
{
proxyMap[proxy.ProxyName] = proxy;
}
///
/// 检索 Proxy
///
/// 数据接口 名称
public IProxy RetrieveProxy(string name)
{
IProxy proxy = proxyMap.ContainsKey(name) ? proxyMap[name] : null;
return proxy;
}
///
/// 删除 Proxy
///
///
public void RemoveProxy(string name)
{
bool exist = proxyMap.ContainsKey(name) ? true : false;
if (exist)
{
proxyMap.Remove(name);
}
}
}
}
Model
作为单例模式,我们希望通过全局直接访问。
描述:存储IMediator
(调节者),以及对视图个人的增、删、查操作。
using System.Collections.Generic;
namespace PureMVC
{
///
/// 负责保存对Mediator的引用
///
public class View: Singleton
{
///
/// 存储 Mediator
///
private Dictionary mediatorMap;
private void Awake()
{
mediatorMap = new Dictionary();
}
///
/// 注册 Mediator
///
///
public void RegisterMediator(IMediator mediator)
{
mediatorMap[mediator.MediatorName] = mediator;
}
///
/// 检索 Mediator
///
///
public IMediator RetrieveMediator(string name)
{
IMediator mediator = mediatorMap.ContainsKey(name) ? mediatorMap[name] : null;
return mediator;
}
///
/// 删除 Mediator
///
///
public void RemoveMediator(string name)
{
bool exist = mediatorMap.ContainsKey(name) ? true : false;
if (exist)
{
mediatorMap.Remove(name);
}
}
}
}
View
作为单例模式,我们希望通过全局直接访问。
描述:存储IObserver
(观察者),以及增、删、查基本操作。
using System.Collections.Generic;
using UnityEngine;
namespace PureMVC
{
///
/// 负责保存对所有Command对象的引用
///
public class NotificationCenter : Singleton
{
///
/// 存储 Observer
///
private Dictionary observerMap;
private void Awake()
{
observerMap = new Dictionary();
}
///
/// 添加 Observer
/// 注册 消息接口的信息
///
/// 消息接口 名称
/// 消息接口 内容
public void AddObserver(string name, IObserver observer)
{
if (!observerMap.ContainsKey(name))
{
observerMap.Add(name, new List());
}
observerMap[name].Add(observer);
}
///
/// 添加 Observer(重载)
/// 注册 存储的监听事件信息
///
/// 消息接口 内容
public void AddObserver(IObserver observer)
{
string[] list = observer.NotificationList();
for (int i = 0; i ProxyName; set => ProxyName = name; }
///
/// 消息 发送
///
public void SendNotification(string name, object data)
{
Facade.Instance.SendNotification(name, data);
}
}
}
- 即 对数据的处理。如获取SQLite数据库数据,如英雄名、技能名、CD、生命值等信息。因此需求
IProxy
接口,以更好在ProxyMap
索引和处理。 - 有了数据,则需要通知视图做出相应的表现,自然需要
INotice
接口。
更多说明: 为什么Proxy
不需要IObserver
接口以接受外部消息?Proxy
的职责是处理数据,如读取数据,修改数据,记录数据等。这一行为是独立进行,不需要别人告诉他"嘿!我UI变了,你得给我数据了!",而是别人"我的视图变了,我看看他提供了哪些数据索引或调整方法来使用。