PureMVC 术语阐述与最佳实践
用 PureMVC 创建健壮的,易扩展的,易维护的客户端程序
附 ActionScript3 和 MXML 例子
AUTHOR: Cliff Hall <cliff@puremvc.org>
LAST MODIFIED: 3/02/2008
翻译:张泽远 <51ajax.net@gmail.com>
最后更新:2008/4/27
PureMVC 结构
---------------------------------------------------------------------------------------------------------------------------------------------
PureMVC 框架有一个非常明确的目的,即把程序分为低耦合的三层:模型(Model),视图(View),控制器
(Controller)。
降低模块间的耦合性,各模块如何结合在一起工作对于创建易扩展,易维护的应用程序是非常重要的。
本框架实现了经典的 MVC 框架,应用程序被分为三层:模型,视图,控制器。每一层的具体实现类都是单一实
例(只能创建一个实例的类,单例模式)。
第四个单例,Façade 负责各层之间的通信。
Model & Proxies
-------------------------------------------------------------------------------------------------------------------------------------------
Model 简单的指向 Proxy 的引用。Proxy 代码负责操作数据模型,与远程服务通信存取数据。
View & Mediators
-------------------------------------------------------------------------------------------------------------------------------------------
视图指向 Mediator 的引用。Mediator 管理视图组件,增加事件监听器,操作视图组件的状态,如果需要可
以发送通知(Notification)到系统的其它部分,或者从系统的其它部分接收通知(Notification)。
这样分离了视图的定义和它的控制逻辑。
Controller & Commands
-------------------------------------------------------------------------------------------------------------------------------------------
控制器包括命令类及其映射。命令类是无状态的,只有需要时才被创建。
命令类可以获取 Proxy 并与之交互,发送通知(Notification),执行其它命令类。
经常用于各种综合复杂的或系统范围的操作,比如应用程序启动或关闭,这里记述业务逻辑。
Façade & Core
-------------------------------------------------------------------------------------------------------------------------------------------
Façade 单例初始化 Model, View, Controller,并且能访问各层类的 Public 方法。
通过继承 Façade 类,应用程序可以得到 MVC 的好处但不需要直接的 Import 具体的类去操作。所以需要实现
一个具体的 Façade 类,而且只需要一个。非常简单,写一个继承 Façade 的子类即可。
Proxies, Mediators and Commands 之间就可以使用刚才创建的具体的 Façade 类互相访问和通信。
观察者 & 通知
-------------------------------------------------------------------------------------------------------------------------------------------
PureMVC 应用程序可能运行在不能访问 Flash Event 和 EventDispatcher 类的环境中,所以框架使用观察者模
式以一种松耦合的方式在 Model, View, Controller 之间通信。
你不需要关注 PureMVC 的观察者模式是怎么实现的,它已经内嵌到框架中。使用一个非常简单的方法从
Model, View, Controller 发送通知(Notification),甚至不需要创建一个 Notification 实例。
Notification 可以用来触发执行一个命令
-------------------------------------------------------------------------------------------------------------------------------------------
命令在 Façade 实现类中被映射到 Notification 名,当 Notification 被发送后,注册的相应的命令类就会
自动被执行。命令类实现复杂的交互,降低 View 和 Model 之间的耦合性。
Mediator, 声明感兴趣的 Notification 和接收 Notification
-------------------------------------------------------------------------------------------------------------------------------------------
当用视图组件注册 Mediator 时,listNotifications 方法将会被调用返回 Mediator 感兴趣的 Notification,
listNotifications 方法必须返回所有感兴趣的 Notification 名的数组。
然后,当相同名称的 Notification 在系统中被发送时,感兴趣的 Mediator 就会被通知,调用其 handleNotification
方法,并传递一个 Notification 的引用。
Proxies 可以发送,但不能接收 Notification
-------------------------------------------------------------------------------------------------------------------------------------------
Proxies 因为各种原因要发送 Notification,例如一个远程服务通知系统接收到信息,或者发送一个数据被更
新的通知。
但 Proxy 接收 Notification 就会导致与 View 和 Controller 关联过于紧密。
View 和 Controller 有必要从 Proxies 接收 Notification,因为它们的职责就是通过可视化的界面使用户能与
Proxies 持有的数据交互。
但 View 和 Controller 的变化不能影响数据模型。
例如,一个后台管理程序和一个面向用户程序共用一个 Model 层,如果只是用例不同,那么就可以由
View/Controller 传递不同的参数从而能够使用相同的 Model 层。
Façade
---------------------------------------------------------------------------------------------------------------------------------------------
为了简化应用程序开发,PureMVC 使用了外观模式。
Façade 管理 Model,View, Controller 之间的请求,使得代码不必再 import 想要操作的类,减少了代码间的依赖性。
Façade 类在它的构造方法中自动的实例化 Model, View, Controller 类。
在应用程序中应该继承框架中的 Façade 类,用于初始化控制命令映射,执行一个 Command 来创建 Model,View
实例。
什么是一个具体的 Façade?
-------------------------------------------------------------------------------------------------------------------------------------------
Façade 看起来很抽象,因为到现在还没有看到一个具体的例子。
你需要写一个继承框架中 Façade 类的子类,然后添加或重写一些方法,以适用于自己的应用程序。
创建的这个具体的 Façade 类被用于访问和通知 Commands, Mediators, 和 Proxies,起到关键性的作用。习
惯性的被命名为" ApplicationFacad ", 但你可以使用其它任何想要的名字.
通常,不管使用的是什么平台,应用程序总得创建视图组件。在 Flex 里,一个 MXML 应用程序实例化它的所
有子组件,或者是一个 Flash 程序创建所有的对象到 Stage 上。一旦视图组件被创建,PureMVC 就会启动并
准备好 Model 和 View。
创建的 Façade 类同时也被用来启动 PureMVC,在应用程序中调用 Façade 单例的"startup"方法,并传递应
用程序的一个引用,不需要了解与 PureMVC 关联起来的细节。
创建一个具体的 Façade 类
-------------------------------------------------------------------------------------------------------------------------------------------
Façade 类并不复杂,看看下面的一个例子。
package com.me.myapp
{
import org.puremvc.as3.interfaces.*;
import org.puremvc.as3..patterns.facade.*;
import com.me.myapp.view.*;
import com.me.myapp.model.*;
import com.me.myapp.controller.*;
// A concrete Facade for MyApp
public class ApplicationFacade extends Facade implements IFacade
{
// 定义 Notification 名字常量
public static const STARTUP:String = "startup";
public static const LOGIN:String = "login";
// 得到 ApplicationFacade 单例的工厂方法
public static function getInstance() : ApplicationFacade
{
if ( instance == null ) instance = new ApplicationFacade( );
return instance as ApplicationFacade;
}
// 注册命令,建立命令与 Notification 名的映射
override protected function initializeController( ) : void
{
super.initializeController();
registerCommand( STARTUP, StartupCommand );
registerCommand( LOGIN, LoginCommand );
registerCommand( LoginProxy.LOGIN_SUCCESS, GetPrefsCommand );
}
// 启动 PureMVC, 在程序中调用这个方法即可
public function startup( app:MyApp ) : void
{
sendNotification( STARTUP, app );
}
}
}
上述代码中需要注意以下几点:
继承了 PureMVC 的 Façade 类,实现了 IFacade 接口。
没有重写构造方法,如果要重写构造方法,那么必须首先调用父类的构造方法。
定义了一个 getInstance 的类方法用来返回单一实例,该方法创建并保存类的实例。实例的引用被保存到
父类的一个 protected 属性中,在返回实例时必须转换为子类的类型。
定义了 Notification 名字的常量。系统的其它部分通过 Façade 互相访问和通信,所以 Façade 类是定义
Notification 名字常量最理想的地方。
初始化命令与 Notification 名之间的映射。
提供一个带有应用程序类型参数的 startup 方法,该参数能过 Notification 传递到 StartupCommand。
同时 Façade 子类会继承父类的一点功能。
初始化 Facade 类
-------------------------------------------------------------------------------------------------------------------------------------------
Façade 的构造方法调用一个 protected 方法,初始化 Model,View 的 Controller 实例,并保存它们的引用。
Façade 把 Model, View, Controller 关联起来,避免它们直接交互。
下面我们看一个具体实例:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="facade.startup(this)">
评论0
最新资源