1、ade7具体Faade是什么样子的?为程序创建Fa初始化Fa10Notification12Event与Notification定义Notification和Event常量13Command14SimpleCommand和MacroCommand的使用降低Command与Mediator, Proxy的耦合度复杂的操作与业务逻辑1516PureMVC 是 Futurescale 公司创建并维护的开源自由的程序框架。Futurescale, Inc. Copyright 2006-08, Some rightsreserved。使用 PureMVC 必须遵守美国 Creative Commons
2、 3.0 Attribution 协议。PureMVC、本文档以及任何从Futurescale 网站下载的文档、培训资料及示例代码,都不提供任何明示或者默示的担保,包括但是不限于是否符合特定的目的、未侵害他人权利的担保。Page 2 of 445/20/2008 11:17 PMMediator21Mediator的职责转化View Component类型监听并响应View Component在Mediator里处理NotificationMediator和Proxy之间、Mediator和其他Mediator之间的耦合用户与View Component和Mediator的交互25272223
3、28Proxy33Proxy的职责转换数据对象避免对Mediator的依赖封装域逻辑与Remote Proxy通信34363738启示PureMVC 是一个定位于设计高性能 RIA 客户端的基于模式的框架。现在它已经被移植到其他的平台上,包括服务器端环境。本篇文档论述针对于客户端。PureMVC 在不同平台语言下的阐述、实现,PureMVC 所使用的模式在“四人帮”的设计模式:可复用面向对象软件的基础一书中有很好的论述。强烈推荐。Page 3 of 44PureMVC框架的目标很明确,即把程序分为低耦合的三层:Model、View和Controller。降低模块间的耦合性,各模块如何结合在一起
4、工作对于创建易扩展,易维护的应用程序是非常重要的。在PureMVC实现的经典MVC元设计模式中,这三部分由三个单例模式类管理,分别是Model、View和Controller。三者合称为核心层或核心角色。PureMVC中还有另外一个单例模式类Faade,Faade提供了与核心层通信的唯一接口,以简化开发复杂度。Model 保存对 Proxy 对象的引用,Proxy 负责操作数据模型,与远程服务通信存取数据。这样保证了 Model 层的可移植性。View 保存对 Mediator 对象的引用 。由 Mediator 对象来操作具体的视图组件(View Component,例如 Flex 的 Da
5、taGrid 组件),包括:添加事件监听器 ,发送或接收 Notification ,直接改变视图组件的状态。这样做实现了把视图和控制它的逻辑分离开来。Controller 保存所有 Command 的映射。Command 类是无状态的,只在需要时才被创建。Page 4 of 44Command 可以获取 Proxy 对象并与之交互,发送 Notification,执行其他的 Command。经常用于复杂的或系统范围的操作,如应用程序的“启动”和“关闭”。应用程序的业务逻辑应该在这里实现。ade 类 应 用 单 例 模 式 , 它 负 责 初 始 化 核 心 层 ( Model , View
6、和Controller),并能访问它们的 Public 方法。这样,在实际的应用中,你只需继承 Faade 类创建一个具体的 Faade 类就可以实现整个 MVC 模式,并不需要在代码中导入编写 Model,View 和Controller 类。Proxy、Mediator 和 Command 就可以通过创建的 Faade 类来相互访问通信。PureMVC 的 通 信 并 不 采 用 Flash 的 EventDispatcher/Event , 因 为PureMVC 可能运行在没有 Flash Event 和 EventDispatcher 类的环境中,它的通信是使用观察者模式以一种松耦合的
7、方式来实现的。你可以不用关心 PureMVC 的 Observer/Notification 机制是怎么实现的,它已 经 在 框 架 内 部 实 现 了 。 你 只 需 要 使 用 一 个 非 常 简 单 的 方 法 从 Proxy,Mediator, Command 和 Facade 发送 Notification,甚至不需要创建一个Notification 实例。Facade 保存了 Command 与 Notification 之间的映射。当 Notification(通知)被Page 5 of 44发出时,对应的 Command(命令)就会自动地由 Controller 执行。Comm
8、and 实现复杂的交互,降低 View 和 Model 之间的耦合性。当用 View 注册 Mediator 时,Mediator 的 listNotifications 方法会被调用,以数组形式返回该 Mediator 对象所关心的所有 Notification。之后,当系统其它角色发出同名的 Notification(通知)时,关心这个通知的Mediator 都会调用 handleNotification 方法并将 Notification 以参数传递到方法。在很多场合下 Proxy 需要发送 Notification(通知),比如:Proxy 从远程服务接收到数据时,发送 Notific
9、ation 告诉系统;或当 Proxy 的数据被更新时,发送 Notification 告诉系统。如果让 Proxy 也侦听 Notification(通知)会导致它和 View(视图)层、Controller(控制)层的耦合度太高。View 和 Controller 必须监听 Proxy 发送的 Notification,因为它们的职责是通过可视化的界面使用户能与 Proxy 持有的数据交互。不过对 View 层和 Controller 层的改变不应该影响到 Model 层。例如,一个后台管理程序和一个面向用户程序可能共用一个 Model 类。如果只是用例不同,那么 View/Control
10、ler 通过传递不同的参数就可以共用相同的Model 类。Page 6 of 44MVC 元设计模式的核心元素在 PureMVC 中体现为 Model 类、 View 类和为了简化程序开发,PureMVC 应用了 Faade 模式。ade 是 Model、View 和 Controller 三者的“经纪人”。实际编写代码时你并不用导入这三者的类文件,也不用直接使用它们。ade 类已经在构造方法包含了对核心 MVC 三者单例的构造。一般地,实际的应用程序都有一个 Faade 子类,这个 Faade 类对象负责初始化 Controller(控制器),建立 Command 与 Notificatio
11、n 名之间的映射,并执行一个 Command 注册所有的 Model 和 View。ade 类应被当成抽象类, 永远不被直接实例化。针对具体的应用程序,你应该具体编写 Faade 的子类,添加或重写 Faade 的方法来实现具体的应用。按照惯例,这个类命名为“ApplicationFacade”(当然,命名随你喜欢),如前所述,它主要负责访问和通知 Command,Mediator 和 Proxy。通常,不同的运行平台都会创建视图结构,尽管创建过程不一样。(比如 Flex中 MXML 程序负责实例化所有子视图组件,Flash 影片在 Stage 上构建可视对象)。视图结构构建完毕时,整个 Pu
12、reMVC 机制也已经安置妥当。创建的 Facade 子类也被用来简化“启动”的过程。应用程序调用 Facade 子类的 startup 方法,并传递自身的一个引用即完成启动,使得应用程序不需要过多了解 PureMVC。ade 类的内容很简单。思考下面的例子:Page 7 of 44ApplicationFacade.as:package com.me.myappimport org.puremvc.as3.interfaces.*;import org.puremvc.as3.patterns.facade.*;import com.me.myapp.view.*;import com.me
13、.myapp.model.*;import com.me.myapp.controller.*;/ MyApp 程序的 Faade 类public class ApplicationFacade extends Faade implements IFacade/定义 Notification(通知)常量public static const STARTUP:Stringpublic static const LOGIN:= startup;login/得到 ApplicationFacade 单例的工厂方法public static function getInstance() : Appli
14、cationFacadeif ( instance = null ) instance = new ApplicationFacade( );return instance as ApplicationFacade;/注册 Command,建立 Command 与 Notification 之间的映射override protected function initializeController( ) : voidsuper.initializeController();registerCommand( STARTUP, StartupCommand );Page 8 of 44registe
15、rCommand( LOGIN, LoginCommand );registerCommand( LoginProxy.LOGIN_SUCCESS,GetPrefsCommand );/启动 PureMVC,在应用程序中调用此方法,并传递应用程序本身的引用public function startup( app:MyApp ) :sendNotification( STARTUP, app );上述代码需要注意以下几点:o ApplicationFacade 继承自 PureMVC 的 Faade 类,Fa类实现了 IFacade 接口。o 这个例子里 ApplicationFacade 没有
16、重写构造方法 。如果重写构造方法,应该在构造方法里先调用父类的构造方法。o 类方法 getInstance 用于返回 ApplicationFacade 的单例,并将实例保存在父类的一个 protect 变量中。在返回该实例之前必须先把它转化为 ApplicationFacade 类型。o 定义了 Notification 名称常量。ade 类是整个系统其他角色相互访问通信的核心,所以在这里定义 Notification(通知)名称常量是最合适的。Page 9 of 44o 初始化 Controller(控制器),并建立 Command 与 Notification 之间的映射,当 Notif
17、ication(通知)发出时相关的 Command(命令)就会被执行。o 提供一个带有应用程序类型参数的 startup 方法,该参数能过Notification 传递到 StartupCommand。实现这些只需要继承父类很少的功能。PureMVC 的 Faade 类在构造方法中初始化了 Model、View 和Controller 对象,并把对它们的引用保存在成员变量。这样,Faade 就可以访问 Model、View 和 Controller 了。这样把对核心层的操作都集中在 Faade,避免开发者直接操作核心层。那么,在具体的应用程序中,Faade 是何时何地初始化的呢?请查看下面的F
18、lex 代码:MyApp.mxml:Script!CDATA/获 取 ApplicationFacadeimport com.me.myapp.ApplicationFacade;private var facade:ApplicationFacade = ApplicationFacade.getInstance();Page 10 of 44/mx:视 图 层 的其他代码 -Application上面这个程序很简单:程序运行时创建视图结构,得到 ApplicationFaade 实例,调用它的 startup 方法。注意:在 AIR 中,我们会使用“applicationComplete”
19、代替这里的“creationComplete”;在 Flash 中,我们可以把对 startup 的调用放在第 1 帧或文档类里。请注意例子中以下几点:o 我们使用了 MXML 标签,这种普遍的方式,创建程序的界面。以标签开始,包含组件或容器,不管是 Flex 内嵌的组件还是自定义的。o 声明并初始化了一个私有变量,(用于)获取 ApplicationFacade单例。o 我们初始化这个变量时使用了 getInstance 类方法,在应用程序的creationComplete 事件触发时,Facade 和相关的 Model,View,Controller 都已经实例化完毕(尽管此时还没有创建任何 Mediator和 Proxy)。o 我们在 Application 标签中指定了对 creationComplete 事件的处理过程:调用 startup 方法,并传参主程序的引用。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1