PureMVC(AS3)剖析:开篇

PureMVC(AS3)剖析:开篇


缘起

自从事flash webgame开发起,3个项目都使用到了MVC模式:1个自己构建的MVC没有使用外部框架;2个使用的PureMVC框架。对PureMVC也有了一定的深度的认识,是时候来总结、吐槽下。现在网上已经流传很多关于PureMVC的资源,但是总觉得深度不够,故有了现在这个系列,我尽量带着自己的思考深入的介绍PureMVC,同时也能引起大家的思考。这里我并不是一味的说PureMVC有多好,它也有值得质疑和使用不爽的地方。

MVC思维

要了解PureMVC框架,首先得有MVC的思维方式,用MVC的思想去思考问题,分解需求、实现需求。MVC背后的核心思想是:

代码重用(code reusability)、关注点分离(separation of concerns,SoC)

MVC思维围绕这两点转,下面举个例子说明。对于一个游戏或软件来说,给人的第一感觉就是界面(视图View),它展示了一些数据等信息给用户。这些界面上的数据可以存储在视图View属性或定义的变量中,如游戏中用户信息栏中显示玩家的等级、经验、昵称:

图:玩家信息栏界面

这样数据跟视图绑定在一起,其它界面视图(玩家详细信息栏)想要等级、经验、昵称等数据需要访问玩家信息栏界面,又或者从后台重新拉取。

图:玩家详细信息界面

这里违反了“代码重用和关注点分离”思想,需要把数据独立出来保存在一个与View无关地方模型(Model),多个视图可以共用一份数据。这样代码即可重用,关注点也实现了分离, View只需要关注如何展示信息, Model只需要关注数据本身及相关逻辑。

上面达到了界面和数据分离之后,但是思考这样一个过程:用户操作了View需要更新Model,同理Model改变了需要更新View的显示,该如何去做?可能会想到用户操作View时直接调用Model接口去更新数据,这时其他共用这个Model的视图View如何同步更新又是一个问题。Model改变了数据,直接调用View接口更新显示的话,它必须要知道所有的共用这个模型Model的视图View。

这样视图View与模型Model就不能达到彻底的“代码重用和关注点分离”。MVC的指导思想就是把这个部分代码独立出来称为控制器Controller。模型和视图从此也只关心控制器,而不关心对方。他们的代码都是处理自己的事情,别人的事情全部交给控制器去办,这使得他们自己的功能也非常独立,减少了需要考虑的要素。

在这之后,三者的关系只存在简单的调用代码。那么为了能够彻底的分离和解耦,就可以将调用代码改为事件或者其他的动态形式(如发布/订阅、依赖注入等等),常用的MVC框架都实现了这样的功能。

图:MVC结构图(实线——>表示依赖;虚线---->表示事件/通知等)

l  模型(Model):“数据模型”(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权力,例如对数据库的访问。“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。但是模型中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。(比较:观察者模式(软件设计模式))

l  视图(View):视图层能够实现数据有目的的显示(理论上,这不是必需的)。在视图中一般没有程序上的逻辑。为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。

l  控制器(Controller):控制器起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据模型上的改变

请大家记住“MVC思维“及上面这些描述,后面还会引用这些。

PureMVC框架

PureMVC框架的目标很明确,即把程序分为低耦合的三层:Model、View和Controller。降低模块间的耦合性,各模块如何结合在一起工作对于创建易扩展,易维护的应用程序是非常重要的。

在PureMVC实现的经典MVC元设计模式中,这三部分由三个单例模式类管理,分别是Model 、View和Controller。三者合称为核心层核心角色。PureMVC中还有另外一个单例模式类——FaçadeFaçade提供了与核心层通信的唯一接口,以简化开发复杂度

图: PureMVC设计示意图(摘自官方网站

从设计图中可以清楚看到,除了核心层、Façade之外,还有Mediator、Proxy、Command

Proxy: Model 保存对 Proxy 对象的引用,Proxy 负责操作数据模型,与远程服务通信存取数据。

Mediator: View 保存对 Mediator 对象的引用 。由 Mediator 对象来操作具体的视图组件,包括:添加事件监听器,发送或接收 Notification ,直接改变视图组件的状态。这样做实现了把视图和控制它的逻辑分离开来。

Command: Controller 保存所有 Command 的映射。Command 类是无状态的,只在需要时才被创建。Command 可以获取 Proxy 对象并与之交互,发送 Notification,执行其他的 Command。

为了彻底解耦,避免直接的函数调用,PureMVC使用观察者模式(发布/订阅)的形式传递消息。PureMVC 的通信并不采用 Flash 的 EventDispatcher/Event,因为PureMVC 可能运行在没有 Flash Event 和 EventDispatcher 类的环境中,它的通信是使用观察者模式以一种松耦合的方式来实现的。

你可以不用关心 PureMVC 的 Observer/Notification 机制是怎么实现的,它已经在框架内部实现了。你只需要使用一个非常简单的方法从 Proxy, Mediator, Command 和 Facade 发送 Notification,甚至不需要创建一个Notification 实例。

下面是我对PureMVC的理解画的设计示意图:

图: PureMVC另种示意图

时间: 2024-10-04 00:59:49

PureMVC(AS3)剖析:开篇的相关文章

flash PureMVC 使用例子_Flash as3

此例环境:flash cs3链接PureMVC类<编辑->首选参数->ActionScript->ActioScript 3.0 设置(加上你的下载的PureMVC类包), PureMVC下载地址>开始动手喽~1, 在flash里准备一下要显示层的东东: 此例就画了一个背景方框, 添加一个动态的TextField命名为txt, 然后绑定一个类AppTextField.as; AppTextField.as里需要接收一个字符串并显示出来, 些字符串数据就是来自于数据层的(后面有

puremvc框架之hello world!

puremvc是一个可应用于多种语言.多种平台的mvc框架.根据官网上的描述,现在已经支持下列语言: 官方也推出了最佳实践的中文文档,当然,园子里也有兄弟说它烂的 :)   跟asp.net mvc框架有所不同,在asp.net mvc中,一个http请求过来,controller会自动去取得数据,最终转化为model,然后选取一个view进行呈现,同时把model传到view中,一切还算比较简单.   然而puremvc除mvc模式外,渗杂了更多的模式:比如facade(门面),observe

puremvc框架之Command

在前一篇 puremvc框架之hello world! 里,已经对这个框架有了一个大概的认识,不过在消息的处理上,有一个不太适合的地方: 为了完成响应消息,TextMediator亲自去监听自己感兴趣的消息类型,然后亲自来处理.要知道:Mediator属于View层(即:MVC中的V),它最好是什么也不干,仅仅与界面保持联系即可,对于如何响应消息这类粗活,应该交由Controller层(即MVC中的C)来处理最适合不过,所以这一章介绍如何把消息处理由V(View)转移到C(Controller)

puremvc框架之proxy

上一篇 puremvc框架之Command 里,已经学习了如何利用Command来解耦View层与业务逻辑的依赖,但是仍然有二个问题: 1.ButtonMediator中发送消息时,仍然采用硬编码的方式,将消息内容写死在代码中: private function btnClick(e:MouseEvent):void{ this.sendNotification(AppFacade.CHANGE_TEXT,"Hello PureMVC !"); } 这显然不是一个好的设计,不够灵活 2

PureMVC(AS3)剖析:吐槽

PureMVC(AS3)剖析:吐槽 写在前面 世上没有银弹--不存在适用于所有情况的框架,只有适合的框架.再者任何一个好的东西(语言.框架等)最终还取决于用的人,语言和框架本身并不能保证用户的代码清晰.解耦等,当然它只是尽可能地做到这点.所以记住我写这篇不是为了否定PureMVC,相反是为了更好的了解它.使用它. 1.  吐槽一:过于强调解耦 PureMVC引入了多种设计模式.消息机制(使用观察者模式,发布/订阅模式)来解耦各个模块,它确实做到了这点,但是彻底解耦是需要代价的! 1.1.    

PureMVC(AS3)剖析:实例

PureMVC(AS3)剖析:实例 实例 上篇介绍了MVC的思维方式"代码重用(code reusability).关注点分离(separation of concerns,SoC)",并介绍了PureMVC框架的设计.本篇从一个实例出发,详细介绍PureMVC框架中的元素.推荐的项目目录组织方式.代码格式等等. 1.  PureMVC模块划分 上篇中介绍了PureMVC框架设计中存在的角色,这里先回顾一下:经典MVC元设计模式中的三部分由三个单例类管理,分别是Model .View和

PureMVC(AS3)剖析:设计模式(二)

PureMVC(AS3)剖析:设计模式(二) 模式 上一篇中介绍了PureMVC中使用的3种设计模式:单例模式.观察者模式.外观模式.本篇将继续介绍剩下的3种设计模式: l  使用中介者(Mediator)模式来封装UI与系统中其他对象的交互,使得各对象不需要显示地互相引用,从而使得其耦合松散,而且可以独立地改变它们之间的交互: l  使用代理(Proxy)模式为数据对象提供代理以控制数据对象的访问,PureMVC中Proxy负责操作数据模型,与远程服务信存取数据: l  使用命令(Comman

PureMVC(AS3)剖析:设计模式(一)

PureMVC(AS3)剖析:设计模式(一) 模式 PureMVC框架的目标很明确,即把程序分为低耦合的三层:Model.View和Controller.降低模块间的耦合性,各模块如何结合在一起工作对于创建易扩展,易维护的应用程序是非常重要的.PureMVC框架使用多重设计模式来实现解耦彻底.灵活性. l  单例(singleton)模式保证一个类仅有一个实例,并提供一个访问它的全局访问点.在PureMVC实现的经典MVC元设计模式中,这三部分由三个单例类管理,分别是Model .View和Co

WPF基础到企业应用系列1——开篇有益

1.开篇前言 关于本人--圣殿骑士刚入住博客园和51CTO写技术博客,目前主要在一家外资企业从事项目管理.技术架构及企业技术培训工作.由于工作和项目需要,所以对一些技术进行了较为深入的研究,之前在整个公司做过一些技术专场的培训,由于每次时间较短且人员较多的关系,没能讲得很透彻,所以挺对不住那些同事的.现在在园子里开一个博客,希望能把所学的微薄知识书写出来,以供大家参考.近期将针对这些培训专场推出"OO到设计模式"."WCF基础到企业应用"."WPF基础到企