PureMVC 孙晓申
MVC MVC并没有明确的定义,从字面上简单的理解为:Model(模型),View(视图)和Controller(控制),简单介绍就是:将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式
Model View Controller
PureMVC是在基于模型、视图和控制器MVC模式建立的一个轻量级的应用框架,这种开源框架是免费的,它最早出现在ActionScript 3语言使用的Adobe Flex、Flash和AIR世界里,现在已经移植到几乎所有主要的发展平台
PureMVC框架的目标很明确,即把程序分为低耦合的三层:Model、View和Controller。 · 在PureMVC实现的经典MVC元设计模式中,这三部分由三个单例模式类管理,分别是Model、View和 Controller。三者合称为核心层或核心角色。 PureMVC中还有另外一个单例模式类——Façade,Façade提供了与核心层通信的唯一接口
Controller保存所有Command的映射。Command类是无状态的,只在需要时才被创建。 View View Model Model Facade Facade Controller保存所有Command的映射。Command类是无状态的,只在需要时才被创建。 负责初始化核心层(Model,View和Controller),并能访问它们的Public方法 View保存对Mediator对象的引用 。由Mediator对象来操作具体的视图组件 Model保存对Proxy对象的引用,Proxy负责操作数据模型(Value Object),与远程服务通信存取数据
pureMVC通信机制 名字 报体 PUREMVC使用观察者模式,各层之间能以一种松耦合的方式进行通信,并且与平台无关 通信机制Notification 任意AS对象 名字 报体
Façade和Proxy只发送Notification Mediators既可以发送也可以接受Notification Notification被映射到Command Command也可以发送Notification 这是一种“发布/订阅”机制,所有的观察者都可以收到相同的通知
Facade Controller Model View
Facade Façade是Model、View、Controller三者的“经纪人”。实际编写代码时不需要导入这三者的类文件,也不用直接使用它们。Façade类已经在构造方法包含了对核心MVC三者单例的构造。 实际应用程序都有一个Façade子类,这个Façade类对象负责初始化Controller(控制器),建立Command与Notification名之间的映射,并执行一个Command注册所有的Model和View
Façade类应当被当成抽象类,永远不被直接实例化。针对具体的应用程序,应具体编写Façade的子类,添加或重写Façade的方法来实现具体的应用 startup方法启动
Command Controller注册侦听每一个Notification,当被通知到时,Controller实例化一个与该Notification对应的Command类的对象。最后,将将Notification作为参数传递给execute方法。 Command无状态
Command Command要实现Icommand接口 SimpleCommand MacroCommand execute (x:Inotification) initializeMacroCommand (x:Inotification) Command与Mediator和Proxy交互,应避免Mediator和Proxy直接交互
Proxy不监听Notification,也永远不会被通知 Proxy封装了数据模型,管理Data Object及对Data Object的访问,不管数据来自哪里,什么类型 Remote Proxy Proxy and Delegate Protection Proxy Virtual Proxy Smart Proxy Proxy不监听Notification,也永远不会被通知
Mediator Mediator是视图组件(ViewComponent)与系统其他部分交互的中介器 基于Flash的应用程序中,Mediator侦听ViewComponent来处理用户动作和Component的数据请求(Event)。Mediator通过发送和接收Notification来与程序其他部分通信
Mediator 在Mediator实例化时,PureMVC会调用Mediator的listNotificationInterests方法查询其关心的Notification,Mediator则在listNotificationInterests方法中以数据形式返回这些Notification名称,当这些Notification被系统其他部分发出时,Mediator的handleNotification函数会被调用,并传进Notification参数。
Mediator 不应让处理Notification的方法负责复杂逻辑。业务逻辑应放在Command中而非在Mediaotr中。
sendNotification (ApplicationFacade.USER_ADD,userForm.user);
Model View Controller facade.registerProxy(new UserProxy()) facade.registerMediator(new UserFormMediator(app.userForm)) facade.registerCommand(ApplicationFacade.USER_ADD,AddUserCommand); View Controller
THANKS