Pure MVC

您所在的位置:网站首页 床头灯流行款式图片 Pure MVC

Pure MVC

2024-01-28 11:38| 来源: 网络整理| 查看: 265

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; /// /// PureMVC 核心类 Facade /// 只需要创建一个即可 /// /// 负责完成proxy,mediator,command的初始化工作 /// 获取也均通过facade /// /// /// 重写virtual方法 /// /// 执行顺序: /// Model->Controller->View->Facade的顺序 /// 重写Facade一定要调用base.InitializeFacade() /// /// 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"; /// /// 静态初始化 /// static ClockFacade () { m_instance = new ClockFacade (); } /// /// 获取单例 /// /// public static ClockFacade GetInstance () { return m_instance as ClockFacade; } /// /// 启动MVC /// public void Launch () { //通过command命令启动游戏 SendNotification(ClockFacade.START_TIME); } /// /// 初始化Controller,完成Notification和Command的映射 /// protected override void InitializeController () { base.InitializeController (); //注册Command RegisterCommand(START_TIME, typeof(StartTimeCommand)); RegisterCommand(PLAY_TIME, typeof(PlayTimeCommand)); } /// /// 初台化View,Initializes the view. /// View在Model和Controll之后运行 /// UI的创建我放到Command中执行 /// protected override void InitializeView () { base.InitializeView (); } /// /// 注册Proxy /// protected override void InitializeFacade () { base.InitializeFacade (); } /// /// 初始化Model 数据模型 Proxy /// 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(); 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 ListNotificationInterests() { IList list = new List() { 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.效果展示



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3