1.概述
PureMVC就是在MVC的基础上新增了一些设计模式。有关MVC的就不多介绍了,简单说就是将功能模块分成三个部分Model(数据),View(视图),Controller(控制器,逻辑处理)。PureMVC在此基础上新增了Mediator来处理View,Command来处理Controller,Proxy来处理Model,同时还有Facade做一个整体管理,Notification用于相互通信(详细的后续介绍)。
2.设计模式
(1)外观模式
1.主要作用是隐藏系统的复杂性,提供可以访问系统的接口,属于结构型模式,它向现有的系统添加一系列接口,来隐藏系统的复杂性。
2.实际使用中,并不需要直接去访问核心类,而是通过PureMVC提供的Facade类来访问。
(2)中介者模式
1.用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。
2.Mediator是View组件与系统其他部分交互的中介器,一个Mediator下可能关联着多个UI组件。一个UI组件t应该把尽可能自己的状态和操作封装起来,对外只提供事件、方法和属性的简单的 API。
(3)命令模式
1.将一块块逻辑代码封装在一个个类中,然后在需要它的时候进行执行。
2.Command类是无状态的,只在需要时才被创建,并且在被执行(调用Execute方法)之后就会被删除。所以不要在那些生命周期长的对象里引用Command对象。
(4)观察者模式
1.可以实现当一个对象被修改时,会自动通知依赖它的对象(观察者),属于行为型模式。例如我们一个界面可能在多个地方显示着金钱数量,当某个行为改变了这个值,只需发送一个通知,这些显示着金钱数量的UI都能够更新到新的值。
2.PureMVC的通信就是使用观察者模式以一种松耦合的方式来实现的,我们可以使用下面方法在Proxy, Mediator,Command中发送通知。也可以在Facade中直接调用SendNotification发送通知。
(5)单例模式
由于单例模式在我们日常创作项目中使用比较广泛,这里就不做过多介绍了。
3.基本使用
(1)Facade
1.注册相关Command,Proxy,Mediator
2.只需要Facade类就可以实现对三个核心类的访问,
(2)Controller(控制器,逻辑处理)Command
1.Command 管理应用程序的业务逻辑,例如应用程序的启动、终止,协调Model与视图的状态等。
2.Command 的业务逻辑应该避免因Model或View的变化而受到影响。
(3)Model(数据)Proxy
1.Proxy会提供访问数据对象部分属性或方法的API,也可能直接提供数据对象的引用(但不建议这样做,我们应该保护Model,只提供相应的接口来访问)。如果提供了更新数据对象的方法,那么在数据被修改时可能会发送一个Notifidation通知系统的其它部分。
2.Proxy不监听Notification,也永远不会被通知
3.Proxy对象不应该通过引用、操作Mediator对象,应该使用发送Notification的方式来通知Mediator,让其知道数据发生了改变,使相关的UI组件进行相应的更新
(4)View(视图)Mediator
1.检查事件类型或事件的自定义内容。
2.检查或修改View Component的属性(或调用提供的方法)。
3.检查或修改Proxy对象公布的属性(或调用提供的方法)。
4.发送一个或多个Notification,通知别的Mediatora或Command作出响应(甚至有可能发送给自身)。
4.关系
5.案例
这里我做了一个简单的刷新小案例供参考
1.进入游戏,启动MVC
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AppClock : MonoBehaviour {
void Awake () {
//启动PureMVC,完成Controller,Proxies,Mediators的初始化工作
ClockFacade.GetInstance ().Launch ();
}
}
2.Facade
using System;
using System.Collections;
using System.Collections.Generic;
using PureMVC.Interfaces;
using UnityEngine;
/// <summary>
/// PureMVC 核心类 Facade
/// 只需要创建一个即可
///
/// 负责完成proxy,mediator,command的初始化工作
/// 获取也均通过facade
///
///
/// 重写virtual方法
///
/// 执行顺序:
/// Model->Controller->View->Facade的顺序
/// 重写Facade一定要调用base.InitializeFacade()
///
/// </summary>
public class ClockFacade : PureMVC.Patterns.Facade {
public const string START_TIME = "start_time";
public const string PLAY_TIME = "time_play";
public const string UPDATE_TIME_DATA = "update_time_data";
/// <summary>
/// 静态初始化
/// </summary>
static ClockFacade () {
m_instance = new ClockFacade ();
}
/// <summary>
/// 获取单例
/// </summary>
/// <returns></returns>
public static ClockFacade GetInstance () {
return m_instance as ClockFacade;
}
/// <summary>
/// 启动MVC
/// </summary>
public void Launch () {
//通过command命令启动游戏
SendNotification(ClockFacade.START_TIME);
}
/// <summary>
/// 初始化Controller,完成Notification和Command的映射
/// </summary>
protected override void InitializeController () {
base.InitializeController ();
//注册Command
RegisterCommand(START_TIME, typeof(StartTimeCommand));
RegisterCommand(PLAY_TIME, typeof(PlayTimeCommand));
}
/// <summary>
/// 初台化View,Initializes the view.
/// View在Model和Controll之后运行
/// UI的创建我放到Command中执行
/// </summary>
protected override void InitializeView () {
base.InitializeView ();
}
/// <summary>
/// 注册Proxy
/// </summary>
protected override void InitializeFacade () {
base.InitializeFacade ();
}
/// <summary>
/// 初始化Model 数据模型 Proxy
/// </summary>
protected override void InitializeModel () {
base.InitializeModel ();
//也可以放在Command中
RegisterProxy(new TimeDataProxy(TimeDataProxy.NAME));
}
}
3.Mediator
using PureMVC.Interfaces;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ClockPanelMediator : PureMVC.Patterns.Mediator
{
public new const string Name = "ClockPanelMediator";
private ClockPanelView View;
private TimeDataProxy timeData;
public ClockPanelMediator(object viewComponent) : base(NAME, viewComponent)
{
View = ((GameObject)viewComponent).GetComponent<ClockPanelView>();
Debug.Log("panel mediator");
timeData = Facade.RetrieveProxy(TimeDataProxy.NAME) as TimeDataProxy;
//绑定按钮事件
View.ClickTime.onClick.AddListener(OnClickTime);
}
private void OnClickTime()
{
Debug.Log("start game");
SendNotification(ClockFacade.PLAY_TIME);
}
public override void HandleNotification(INotification notification)
{
switch (notification.Name)
{
case ClockFacade.UPDATE_TIME_DATA:
if (timeData!=null)
{
Debug.Log("获取当前时间");
string timeText = string.Format("{0}/{1}/{2} {3}:{4}:{5}",
timeData.TimeData.year, timeData.TimeData.month, timeData.TimeData.day,
timeData.TimeData.hour, timeData.TimeData.min, timeData.TimeData.second);
View.TimeText.text = timeText;
}
break;
}
}
public override IList<string> ListNotificationInterests()
{
IList<string> list = new List<string>() { ClockFacade.UPDATE_TIME_DATA };
return list;
}
}
4.Proxy
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TimeDataProxy : PureMVC.Patterns.Proxy
{
public new const string NAME = "TimeDataProxy";
public TimeDataModel TimeData;
public TimeDataProxy(string name) : base(name, null)
{
TimeData = new TimeDataModel();
}
public void GetTime()
{
//计算当前时间
TimeData.year = DateTime.Now.Year;
TimeData.month = DateTime.Now.Month;
TimeData.day = DateTime.Now.Day;
TimeData.hour = DateTime.Now.Hour;
TimeData.min = DateTime.Now.Minute;
TimeData.second = DateTime.Now.Second;
SendNotification(ClockFacade.UPDATE_TIME_DATA);
}
}
5.Command
1)打开面板
using PureMVC.Interfaces;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StartTimeCommand : PureMVC.Patterns.SimpleCommand
{
public override void Execute(INotification notification)
{
//create ui
GameObject obj = GameObjectUtility.Instance.CreateGameObject("_Prefabs/ClockPanelView");
//bind mediator
Facade.RegisterMediator(new ClockPanelMediator(obj));
}
}
2)获取时间
using PureMVC.Interfaces;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayTimeCommand : PureMVC.Patterns.SimpleCommand
{
public override void Execute(INotification notification)
{
Debug.Log("Time Command");
TimeDataProxy timeData = Facade.RetrieveProxy(TimeDataProxy.NAME) as TimeDataProxy;
if (timeData!=null)
{
timeData.GetTime();
}
}
}
6.效果展示
今天的文章Pure MVC[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/76176.html