Puremvc

框架unitypuremvc

PureMVC健壮、易扩展、易维护

Many so-called Model-View-Controller frameworks today seem to include everything but the kitchen sink. We decided that basic separation of responsibilities according to the MVC meta-pattern could be expressed with a handful of actors. We gave them a built-in means to communicate with each other which reinforces the classic MVC collaboration patterns, and did so with the simplest possible language features. That's why it's been ported to so many languages from the original ActionScript. It just works, with no "magic happens here" bits.

PureMVC优缺点:

  • 1.利用中介者,代理者,命令实现解耦,使得Model、View、Controller之间耦合性降低,提升了部分代码的重用
  • 2.View界面可以实现重用
  • 3.Model数据可以实现重用
  • 3.代码冗余量大,对于简单的功能都得创建View、Mediator、Command、Facade,Proxy,Model脚本
  • 4.操作过程比较繁琐的流程,Mediator中的代码会显得流程较为复杂难懂,除非你很熟悉PureMVC执行原理

PureMVC特点:

  • 1.通知的传递都要经过装箱和拆箱的操作
  • 2.命令/通知是以观察者模式实现,命令/通知在观察者中利用反射获取方法并执行
  • 3.没有Service(可按照MVC的构造,自行添加与网络通讯的这个模块)
  • 4.数据通过通知传递,SendNotification只有一个object类型参数,会感觉数据传输受限,可以将数据组合成一个类型/结构传递,或者是为Notification再拓展一个参数。

一、结构及示例


核心结构

1、PureMVC结构

  • PureMVC把程序分为低耦合的三层:Model、View和Controller。
  • ureMVC实现的经典MVC元设计模式中,这三部分由三个单例模式类管理,分别是Model、View和Controller。三者合称为核心层或核心角色。

    -PureMVC中还有另外一个单例模式类——Facade,Facade提供了与核心层通信的唯一接口,以简化开发复杂度。

2、层级关系


三联

PureMVC使用了观察者模式,所以各层之间能以一种松耦合的方式通信,并且与平台无关。

2.1、Model

数据层

  1. public class MyData 



  2. public int DataValue { get; set; } 




2.2、Proxy

Proxy负责操作具体的数据模型,这样保住了Model层的可移植性,Model只需维持自己的数据结构就好。

  1. using PureMVC.Patterns; 


  2. /// <summary> 

  3. /// 通过proxy代理来进行对数据model的操作 

  4. /// </summary> 

  5. public class MydataProxy : Proxy 



  6. public const string proxname = "MyData01"; 


  7. public MyData MyData; 

  8. public MydataProxy() : base(proxname) 



  9. MyData = new MyData();  





  10. public void AddValue() 



  11. MyData.DataValue++; 


  12. //Facade 和Proxy只能发送Notification,Mediators既可以发送也可以接收Notification,Notification被映射到 Command, 

  13. //同时Command也可以发送Notification。这是一种“发布/订阅”机制,所有的观察者都可以收到相同的通知。 

  14. //例如多个书刊订阅者可以订阅同一份杂志,当杂志有新刊出版时,所有的订阅者都会被通知。 

  15. SendNotification("msg_add",MyData); 




  16. public void SubValue() 



  17. MyData.DataValue--; 


  18. SendNotification("msg_add", MyData); 






2.3、Mediator

Mediator中介由,Mediator对象来操作具体的视图组件,包括:添加事件监听器,发送或接收Notification ,直接改变视图组件的状态。

这样做实现了把视图和控制它的逻辑分离开来。

  1. using System.Collections.Generic; 

  2. using PureMVC.Interfaces; 

  3. using PureMVC.Patterns; 

  4. using UnityEngine; 

  5. using UnityEngine.UI; 


  6. public class MyMediator : Mediator 



  7. public const string MediatorName = "MyMeditor"; 


  8. public Text textNum; 

  9. public Button AddButton; 

  10. public Button SubButton; 


  11. public MyMediator(GameObject root):base(MediatorName) 



  12. //持有对视图中对象的引用 

  13. textNum = root.transform.Find("TextValue").GetComponent<Text>(); 

  14. AddButton= root.transform.Find("BtnAdd").GetComponent<Button>(); 

  15. SubButton= root.transform.Find("BtnSub").GetComponent<Button>(); 



  16. // 视图中的操作 

  17. AddButton.onClick.AddListener(Addbtn); 

  18. SubButton.onClick.AddListener(Subbtn); 




  19. /// <summary> 

  20. /// 操作视图 

  21. /// </summary> 

  22. /// <param name="myData">数据对象</param> 

  23. private void DisplayFun(MyData myData) 



  24. textNum.text = myData.DataValue.ToString(); 




  25. /// <summary> 

  26. /// 与command层通信 

  27. /// </summary> 

  28. private void Subbtn() 



  29. SendNotification("cmd_sub"); 




  30. /// <summary> 

  31. /// 与command层通信 

  32. /// </summary> 

  33. private void Addbtn() 



  34. SendNotification("cmd_add"); 




  35. /// <summary> 

  36. ///定义自己需要关心的消息 

  37. /// </summary> 

  38. /// <returns></returns> 

  39. public override IList<string> ListNotificationInterests() 



  40. List<string> list=new List<string>() 



  41. "msg_add","msg_sub" 

  42. }; 

  43. return list; 




  44. /// <summary> 

  45. /// 处理消息 

  46. /// </summary> 

  47. /// <param name="notification"></param> 

  48. public override void HandleNotification(INotification notification) 



  49. switch (notification.Name) 



  50. case "msg_add": 

  51. case "msg_sub": 

  52. DisplayFun(notification.Body as MyData);  

  53. break; 

  54. default: 

  55. break; 



  56. }  




2.4、Command

Command命令层,Command可以获取Proxy对象并与之交互,发送Notification,执行其他的Command。经常用于复杂的或系统范围的操作,如应用程序的“启动”和“关闭”。应用程序的业务逻辑应该在这里实现。

  1. using PureMVC.Interfaces; 

  2. using PureMVC.Patterns; 


  3. public class MyCommandAdd : SimpleCommand 



  4. public override void Execute(INotification notification) 



  5. //直接调度Proxy处理具体逻辑 

  6. MydataProxy mydataProxy = Facade.RetrieveProxy("MyData01") as MydataProxy; 


  7. mydataProxy.AddValue(); 






  8. public class MyCommandSub : SimpleCommand 



  9. public override void Execute(INotification notification) 




  10. MydataProxy mydataProxy = Facade.RetrieveProxy("MyData01") as MydataProxy; 


  11. mydataProxy.SubValue(); 





2.5、MyFacade

Facade类应用单例模式,它负责初始化核心层(Model,View和Controller),并能访问它们的Public方法。

这样,在实际的应用中,你只需继承Facade类创建一个具体的Facade类就可以实现整个MVC模式,并不需要在代码中导入编写Model,View和Controller类。

Proxy、Mediator和Command就可以通过创建的Façade类来相互访问通信。

一般地,实际的应用程序都有一个Facade子类,这个Facade类对象负责初始化Controller(控制器),建立Command与Notification名之间的映射,并执行一个Command注册所有的Model和View。

  1. using PureMVC.Patterns; 

  2. using UnityEngine; 


  3. public class MyFacade : Facade 



  4. public MyFacade(GameObject root) : base() 



  5. //注册命令,实现消息与命令之间的绑定 

  6. RegisterCommand("cmd_add",typeof(MyCommandAdd)); 

  7. RegisterCommand("cmd_sub",typeof(MyCommandSub)); 


  8. RegisterMediator(new MyMediator(root)); 

  9. RegisterProxy(new MydataProxy()); 





2.6 初始化Facade

注意:除了顶层的Application,其他视图组件都不用(不应该)和Façade交互。

顶层的Application构建视图结构、初始化Façade,然后“启动”整个PureMVC机制。

  1. using System.Collections; 

  2. using System.Collections.Generic; 

  3. using UnityEngine; 


  4. public class GameManager : MonoBehaviour 



  5. public GameObject root; 

  6. // Start is called before the first frame update 

  7. void Start() 



  8. //初始化MyFacade启动PureMVC 

  9. MyFacade myFacade = new MyFacade(root); 






它山之石可以攻玉

[Unity]PureMVC框架解读(上)

Puremvc的更多相关文章

  1. Lua pureMVC

    分享一个lua语言版本的pureMVC. 这个是一个根据AS3(ActionScript 3) pureMVC而转换过来的lua pureMVC.所有的接口完全跟AS3版本一致,本来是想用在项目之中的 ...

  2. 最简puremvc

    工程如下,看来sendNotification是像comand和mediator发消息的 package { import flash.display.Sprite; import flash.eve ...

  3. pureMVC学习之一

    //1var  MainWindow: TMainWindow;begin  Application.Initialize;  Application.MainFormOnTaskbar := Tru ...

  4. 【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现

    转自:http://www.iamsevent.com/post/36.html AS3 Coder]任务七:初涉PureMVC——天气预报功能实现 使用框架:AS3任务描述:了解PureMVC框架使 ...

  5. PureMVC(JS版)源码解析:总结

    PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写博客的过程中得到了些提升.我也是第一次写系列 ...

  6. (转载)puremvc框架之proxy

    (转载)http://www.cnblogs.com/yjmyzz/archive/2010/08/01/1789769.html 上一篇 puremvc框架之Command 里,已经学习了如何利用C ...

  7. 基于HTML5的SLG游戏开发( 三):认识PureMVC

    在游戏开发中,对于一般网络游戏,由于需要多人协同开发,每个人负责不同的模块开发,为了减少耦合,需要用来一些MVC框架,减少模块之间的耦合.我们现在使用的mvc框架是pureMVC.pureMVC的官网 ...

  8. PureMVC(JS版)源码解析(一):观察者模式解析

          假设一种情景,在程序开发中,我们需要在某些数据变化时,其他的类做出相应,例如在游戏中,升级一件装备,会触发玩家金币数量改变,背包数据改变和冷却队列数据改变等等.我们不可能设置setInte ...

  9. PureMVC(JS版)源码解析(二):Notification类

    上篇博客,我们已经就PureMVC的设计模式进行的分析,这篇博文主要分析Notification(消息)类的实现. 通过Notification的构造函数可以看出,PureMVC中的Notificat ...

  10. PureMVC(JS版)源码解析(三):Observer类

          上一篇博客中,我们讲到了Notification类(消息类),Notification(消息)是连接观察者(observer)和通知者(notifier)之间的桥梁.这一篇博客,主要是在代 ...

随机推荐

  1. Dapr 在阿里云原生的实践

    简介: Faas 场景下,比较吸引用户的是成本和研发效率,成本主要通过按需分配和极致的弹性效率来达成.而应用开发者期望通过 FaaS 提供多语言的编程环境,提升研发效率,包括启动时间.发布时间.开发的 ...

  2. Metasploit 实现木马生成、捆绑及免杀

    ​简介: 在渗透测试的过程中,避免不了使用到社会工程学的方式来诱骗对方运行我们的木马或者点击我们准备好的恶意链接.木马的捆绑在社会工程学中是我们经常使用的手段,而为了躲避杀毒软件的查杀,我们又不得不对 ...

  3. vue使用websoket(非封装)

    上代码: create:function(){ this.initWebpack() } methods:{ initWebpack(){//初始化websocket           let us ...

  4. 《最新出炉》系列入门篇-Python+Playwright自动化测试-41-录制视频

    1.简介 上一篇讲解和分享了录制自动生成脚本,索性连带录制视频也一股脑的在这里就讲解和分享了.今天我们将学习如何使用Playwright和Python来录制浏览器操作的视频,以便在需要时进行回放和分析 ...

  5. 使用qemu运行risc-v ubuntu

    参考 Ubuntu installation on a RISC-V virtual machine using a server install image and QEMU 用到的文件 fw_ju ...

  6. CentOS7 升级 curl 到 HTTP2

    目录 文章目录 目录 编译安装 YUM 升级 编译安装 安装编译环境: yum -y groupinstall "Development Tools" yum -y install ...

  7. VS Code 代码片段编写教程

    VS Code 代码片段编写教程 最近要做一个vs code的代码片段插件,于是搜索和学习相关内容,整理分享给大家! [!TIP] 本篇博客50%+内容由BingChat提供,然后作者对内容进行验证和 ...

  8. winform 关于无边框和拖动窗体边缘改变尺寸的 踩坑笔记

    在做美化winform窗体,实现自定义窗体标题栏,圆角边框,并且支持拖拽窗体,最后还要能拖动窗体左.右.下边缘时,改变窗体的宽和高. 一般网上的都有代码,窗体设成无边框,自己加个panel就能实现自定 ...

  9. Android 13 - Media框架(33)- ACodec(九)

    关注公众号免费阅读全文,进入音视频开发技术分享群! 前一节我们学习了Output Format Changed事件是如何上抛并且被处理的,这一节我们紧接着来学习OutputBuffer是如何上抛并且被 ...

  10. WPF开发快速入门【0】前言与目录

    前言 WPF是一个生不逢时的技术,刚推出的时候由于是XP时代,WPF技术有两个不方便的地方: 1.由于操作系统没有自带Framework,需要另外安装,比较麻烦: 2.程序第一次启动时,由于要加载Fr ...