Pure MVC

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.效果展示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值