《PureMVC开发框架使用手册中文版.doc》由会员分享,可在线阅读,更多相关《PureMVC开发框架使用手册中文版.doc(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流PureMVC开发框架使用手册中文版.精品文档.PureMVC开发框架使用手册目录(目录结构=类文件的文件夹结构)1 patterns包1.1 开发框架1.2 框架结构1.3 使用方法1.4 “高内聚低耦合”的实现程序架构要点2 Facade类3 mvc包3.1 Model类3.2 View类3.3 Controller类4 media包4.1 Proxy类4.2 Mediator类4.3 Command类4.4 Commands类5 observer包5.1 Observer类5.2 Notifier类5.3 Notice类正文1 patt
2、erns包是开发框架的顶级包,应该放在程序的类目录的根目录下。1.1 开发框架开发框架就是一个空架子,我们可以自己加工、创造零部件,装配上去,使这个系统按照我们的设计意图运行起来。这个开发框架基于PureMVC框架构建,目标是开发出更健壮、易维护、易扩展、可重用的应用程序。当然,采用这个开发框架并不等于实现了这个目标,要实现这个目标,还需要我们在开发过程中不断调整、不断优化程序架构。实现这个目标的关键是,降低模块间的耦合度。1.2 框架结构这个开发框架分为低耦合的三个层Model、View和Controller。这三部分由三个单例模式类管理,三者合称为核心层。还有一个单例模式类Faade,是整
3、个系统的管理者。简单地说,就是三个核心层、一个管理者,其余的就是零部件,可以按需增减。其架构如下图所示:其中: Model负责保存Proxy名称与实例的映射,根据Proxy名称获取其实例。Proxy负责保存数据对象,存取数据。 View负责保存Mediator名称与实例的映射、Notice名称与观察者的映射,根据Mediator名称获取其实例,根据Notice通知其观察者。Mediator负责保存视图组件,操作具体的视图组件,处理通知。观察者负责保存通知的处理者及其处理方法,收到通知则告知其处理者处理这个通知。 Controller负责保存Notice名称与Command类的映射,执行通知对应
4、的Command。Command负责执行业务逻辑处理通知。 Faade是框架的管理者和通信中心,是框架与外界通信的唯一接口,负责初始化Model、View、Controller单例,发送通知。1.3 使用方法开发框架只是搭建了一个空架子,我们所要做的就是编写具体的Command、Mediator、Proxy等这些零部件,给它们添加自定义属性和方法,保存到Model、View、Controller中。在没有保存Proxy、Mediator和Observer、Command时,Model、View、Controller就是一个空架子。通常,我们需要自定义视图组件:影片剪辑或声音放在Flash库中,
5、它们对应的类文件放在包中,Flash的舞台就是一个自定义视图组件,文档类就是舞台对应的类文件。有时,还需要自定义事件、声音对象、数据对象等等。1.4 “高内聚低耦合”的实现程序架构要点1.4.1 什么是高内聚低耦合?简单地说,就是模块之间不直接互相操作,而是通过中介:通知、事件来实现互操作。举例一:程序中有两个对象A、B,当A发生变化时,需要B随之变化。如果A发生变化时,只发出通知或触发事件,B负责响应,那么A、B之间就是低耦合关系。A、B不必知道对方的实现细节。如果A发生变化时,直接调用B的接口,使B发生相应变化,并获取操作结果,那么A、B之间就是强耦合关系。A、B需要知道对方的一些实现细节
6、(属性或方法)。举例二:球场上打比赛,As是裁判、Bs是球员,As与Bs需要合作。如果比赛需要暂停,As只是吹哨,Bs听到号令就停下来,那么As、Bs之间就是低耦合关系。As、Bs不必抓住对方手脚。如果比赛需要暂停,As直接走过去把Bs控制住,使Bs无法继续行动,那么As、Bs之间就是强耦合关系。1.4.2 实现手段程序架构要点1、采用事件模型2、采用通知机制3、事件模型和通知机制的结合2 Facade类包:patterns类:public class Faade实现:FaadeIFacadeFaade是框架的管理者和通信中心,是框架与外界通信的唯一接口,放在顶级包中,负责初始化Model、V
7、iew、Controller单例,发送通知。2.1 属性/=只允许自己和子类访问 =protected var model:Model; / Model单例protected var view:View; / View单例protected var controller:Controller; / Controller单例protected static var instance:Facade; / Facade单例protected const SINGLETON_MSG:String = Facade already exist!; /消息常量(通常,在自定义Faade类中定义通知名称常量
8、。因为系统全局都要用。)2.2 方法public function Facade() /构造函数,由于Facade是单例,所以应调用单例工厂方法Facade.getInstance(),而不能直接调用该构造函数,否则会抛出异常protected function initFacade():void /初始化Facade单例,子类可追加不要替换public static function getInstance():Faade / Facade单例工厂方法/= 创建三个核心层 = protected function initModel():void /在自定义Faade子类中,若想创建自定义M
9、odel并且自定义Proxy初始化时不需要引用Facade,可以重写这个方法,否则就先调用这个方法,再注册Proxy。注意:这个方法很少被重写,实践中,你更喜欢用command创建并注册Proxy,因为存有可变数据的Proxy很可能需要发送Notice,因此在创建时需要引用Facade。protected function initView():void /在自定义Faade子类中,若想创建自定义View,或想注册自定义Observers,可以重写这个方法,否则就先调用这个方法,再注册Mediator。注意:这个方法很少被重写,实践中你更可能使用command创建并注册Mediator,因为M
10、ediator实例需要发送Notice,因此在创建时需要引用Faade。protected function initController():void /在自定义Facade子类中,若想创建自定义Controller,可以重写这个方法,否则就先调用这个方法,再注册command/= 与Model层的交互 =public function addProxy ( proxy:IProxy ):void /添加proxy实例到Model中public function retrieveProxy ( proxyName:String ):IProxy /从Model中获取proxy实例public
11、 function removeProxy ( proxyName:String ):IProxy /从Model中移除proxy实例public function hasProxy( proxyName:String ):Boolean /判断Model中是否有proxy实例/= 与View层的交互 =public function addMediator( mediator:IMediator ):void /添加mediator实例到View中public function retrieveMediator( mediatorName:String ):IMediator /从View中
12、获取mediator实例public function removeMediator( mediatorName:String ):IMediator /从View中移除mediator实例public function hasMediator( mediatorName:String ):Boolean /判断View中是否有mediator实例/= 与Controller层的交互 =public function addCommand( noticeName:String, cmd:Class ):void /添加Command类到Controller中public function re
13、moveCommand( noticeName:String ):void /从Controller中移除noticeName 对应的Command类public function hasCommand( noticeName:String ) : Boolean /判断Controller中是否有noticeName 对应的Command类/= 与Observer的交互,实现通信机制 =public function sendNotice( noticeName:String, body:Object=null, type:String=null ):void /创建并发送一个通知,这样,我
14、们在实现代码中,就不用再创建通知实例了。public function notifyObservers( notice:INotice ):void /公开这个方法,主要是为了向下兼容,允许你使用faade发送自定义通知。通常,你可以只调用sendNotice方法,根本不需要自己创建通知。3 mvc包只有三个核心类,是三个单例,分别实现MVC三个核心层,是框架的主体(media是配件),不可增减。3.1 Model类包:patterns.mvc类:public class Model实现:Model IModel负责保存Proxy名称与实例的映射,根据Proxy名称获取其实例。3.1.1 属性
15、/= 只允许自己和子类访问 =protected var proxyMap:Object; /保存Proxy名称与实例的映射protected static var instance:Model; /Model单例protected const SINGLETON_MSG:String = Model already exist!; /消息常量3.1.2 方法public function Model() /Model是单例,不能直接调用该构造函数,而应该调用单例工厂方法Model.getInstance(),否则抛出异常protected function initModel():void
16、/自动被构造函数调用,若自定义子类,则在这里添加自定义内容,而不必override构造函数public static function getInstance():Model /Model的单例工厂静态方法/= 操作Proxy实例的接口 =public function addProxy( proxy:IProxy ):void /把Proxy实例赋值给proxyMap的属性,Proxy的名称作为proxyMap属性名public function retrieveProxy( proxyName:String ):IProxy /以proxyName为关键字,获取proxyMap的属性对应的
17、Proxy实例public function removeProxy( proxyName:String ):IProxy /把proxyMap的属性名为proxyName的属性干掉public function hasProxy( proxyName:String ):Boolean /判断proxyMap的属性名为proxyName的属性是否存在3.2 View类包:patterns.mvc类:public class View实现:ViewIViewView负责保存Mediator名称与实例的映射、Notice名称与观察者的映射,根据Mediator名称获取其实例,根据Notice通知其
18、观察者。3.2.1 属性/= 只允许自己和子类访问 =protected var mediatorMap:Object; /存储Mediator名称到Mediator实例的映射protected var observerMap:Object; /存储Notice名称到观察者列表的映射protected static var instance:View; /View单例protected const SINGLETON_MSG:String = View already exist!; /消息常量3.2.2 方法public function View() /View是单例,不能直接调用该构造函
19、数,而应调用单例工厂方法View.getInstance(),否则会抛出异常protected function initView():void /自动被构造函数调用,若自定义子类,就在这里设定自定义内容,而不必override构造函数public static function getInstance():View /View的单例工厂方法/= 对观察者的操作 =public function addObserver( noticeName:String, observer:IObserver ):void /把observer存入观察者列表中,收到通知,就遍历对应的观察者列表,通知各个ob
20、serverpublic function notifyObservers( notice:INotice ):void /通知notice的观察者列表中的所有观察者public function removeObserver( noticeName:String, processor:Object ):void /根据processor从noticeName的观察者列表中移除观察者/= 对Mediator的操作 =public function addMediator( mediator:IMediator ):void /首先把Mediator实例赋值给mediatorMap的属性,med
21、iatorName作为属性名。然后,通过名称获取Mediator实例,并进一步查询它所关心的Notice。若返回Notice列表,则创建观察者(封装Mediator实例及其handleNotice方法),把观察者注册给列表中的每个Notice。最后,触发Mediator实例的被注册事件。public function retrieveMediator( mediatorName:String ):IMediator /根据Mediator名称获取Mediator实例public function removeMediator( mediatorName:String ):IMediator /
22、首先根据Mediator名称获取Mediator实例,若该Mediator实例存在,则查询该mediator实例所关心的Notice,把mediator实例相关的观察者从notice的观察者列表中删除。然后,把该mediator实例从mediatorMap中删除。最后,触发mediator实例的被删除事件。public function hasMediator( mediatorName:String ):Boolean /判断View的mediatorMap中是否有这个mediator实例3.3 Controller类包:patterns.mvc类:public class Controll
23、er实现:ControllerIControllerController负责保存Notice名称与Command类的映射,执行通知对应的Command。3.3.1 属性/= 只允许自己和子类访问 =protected var view:View; /对View单例的引用protected var commandMap:Object; /存储通知名称与Command类的映射protected static var instance:Controller; /Controller单例protected const SINGLETON_MSG:String = Controller already
24、exist!; /消息常量3.3.2 方法/= 创建Controller =public function Controller() /Controller是单例,不能直接调用该构造函数,而应调用单例工厂方法Controller.getInstance(),否则会抛出异常protected function initController():void /自动被构造函数调用,可由子类覆盖,添加自定义内容,而不覆盖构造函数。注意:若自定义View的子类,则也应定义Controller的子类,并override这个方法,象这样:view = MyView.getInstance();public s
25、tatic function getInstance():Controller / Controller的单例工厂方法/= 操作Command =public function executeCommand( note:INotice ):void /执行note对应的Command。首先根据note名称,获取command类,然后,创建command实例,执行command业务逻辑。public function addCommand( noteName:String, cmd:Class ):void /把Command类赋值给commandMap的属性,属性名为noteName。若某个n
26、oteName还没Command,则先给note添加观察者。若某个noteName已有Command,则用新command替换旧的。因为一个note,只能有一个处理者,否则就乱套了。public function hasCommand( noteName:String ):Boolean /判断noteName是否有对应的Commandpublic function removeCommand( noteName:String ):void /从Notice映射中移除注册的Command。首先移除观察者,再干掉command。4 media包是一些中介人,它们是核心层与外界通信的代理人,是框架
27、的配件(mvc是主体),可增减。我们的工作就是给这些配件添加自定义属性和行为,来实现我们的需求。4.1 Proxy类包:patterns.media类:public class Proxy继承:ProxyNotifier实现:Proxy IProxy, INotifierProxy是Model的助理,负责保存数据对象,存取数据,可发送通知。4.1.1 属性public static var NAME:String = Proxy; /Proxy名称常量protected var proxyName:String; / Proxy实例名称protected var data:Object; /数
28、据对象4.1.2 方法/= 访问Proxy =public function Proxy( proxyName:String=null, data:Object=null ) /构造函数,保证proxyName有值,不保证datapublic function getProxyName():String /获取Proxy名称。在Model中,需要根据Proxy名称来获取Proxy实例/= 访问数据对象 =public function setData( data:Object ):void /设定数据对象public function getData():Object /读取数据对象/= 生死
29、关头处理一下 =public function onAdd():void /创建Proxy时public function onRemove( ):void /移除Proxy时4.2 Mediator类包:patterns. media类:public class Mediator继承:Mediator Notifier实现:Mediator IMediator, INotifierMediator是View的助理,负责保存视图组件,操作具体的视图组件,处理通知。4.2.1 属性public static const NAME:String = Mediator; /Mediator名称常量,
30、通常,Mediator用于控制特定的一个或一组视图组件,不需要动态命名protected var mediatorName:String; / Mediator实例名称protected var viewComponent:Object; /保存视图组件4.2.2 方法/= 访问Mediator =public function Mediator( mediatorName:String=null, viewComponent:Object=null ) /构造函数,保证mediatorName有值,不保证viewComponent。也就是说,可以不指定视图。public function g
31、etMediatorName():String /获取mediator名称。在View中,需要根据mediator名称来获取mediator实例/= 读写视图组件 =public function setViewComponent( viewComponent:Object ):void /设定mediator要处理的视图组件public function getViewComponent():Object /获取mediator要处理的视图组件/= 处理Notice =public function listNoticeInterests():Array /列出mediator关注的通知pu
32、blic function handleNotice( notice:INotice ):void /收到通知进行处理/= 生死瞬间处理一下 =public function onAdd( ):void /添加mediator实例时public function onRemove( ):void /移除mediator实例时4.3 Command类包:patterns. media类:public class Command继承:Command Notifier实现:Command ICommand, INotifierCommand是Controller的助理,负责执行单个业务逻辑处理通知。
33、由用户动作触发一个通知,该通知由Command的execute方法来处理。4.3.1 属性无4.3.2 方法public function execute( note:INotice ):void /应在子类中override该方法,添加自定义业务逻辑,处理通知。4.4 Commands类包:patterns. media类:public class Commands继承:Commands Notifier实现:Commands ICommand, INotifierCommands也是Controller的助理,负责执行一系列Command处理通知。维护一个Command列表subCmds。
34、execute时,Commands会按顺序实例化subCmds中的Command,并调用其execute方法。4.4.1 属性private var subCmds:Array; /Command列表,是个FIFO表4.4.2 方法/= 创建Commands =public function Commands() /在子类中,不必自定义构造函数,而是重写initializeMacroCommand方法,若想自定义构造函数,必须调用superprotected function initializeCmds():void /在子类中重写该方法,给Command列表添加Command。注意:Com
35、mand可以是Command或Commands。protected function addSubCmd( cmdRef:Class ): void /给Command列表添加Command/= 执行Commands =public final function execute( note:INotification ) : void /执行Command列表中的所有Command,禁止override该方法5 observer包用于实现通知通信机制。不依赖Flash中的事件模型,而且AS3并没有内置的事件模型。采用观察者模式,实现模块之间的事件驱动通信。Flash事件和PureMVC通知的主
36、要差异是:事件遵循“责任链”模式,在显示层级中“冒泡”直到有父组件处理它;而通知遵循“发布/订阅”模式。使用通知进行通信,PureMVC各模块之间不需要建立父子关系。通知并不是事件的替代物。一般情况下,Mediator给其视图组件添加事件侦听器,按常用方式处理,然后给目标Command广播Notice,或与其他Mediator通信。Proxy通过广播Notice,与Command实例和Mediator通信。5.1 Observer类包:patterns. observer类:public class Observer实现:Observer IObserverObserver负责保存通知的处理者
37、及其处理方法,收到通知则告知其处理者处理这个通知。5.1.1 属性private var processF:Function; /处理函数负责处理通知private var processO:Object; /处理者负责调用处理通知的方法5.1.2 方法public function Observer( processFunc:Function, processor:Object ) /构造函数,设定处理者和处理函数/= 读写processFunc =public function setProcessFunc( processFunc:Function ):void /设定处理函数priva
38、te function getProcessFunc():Function /获取处理函数/= 操作处理者 =public function setProcessor( processor:Object ):void /设定处理者private function getProcessor():Object /获取处理者public function notifyProcessor( notice:INotice ):void /通知notice的处理者public function isProcessor( object:Object ):Boolean /判断object是不是处理者5.2
39、Notifier类包:patterns. observer类:public class Notifier实现:Notifier INotifierNotifier专门负责发送通知。3.1.1 属性protected var facade:Facade = Facade.getInstance(); /引用Faade,这样可减轻实现过程中的代码负担,因为需要经常引用Facade3.1.2 方法public function sendNotice( noticeName:String, body:Object=null, type:String=null ):void /创建并发送通知5.3 No
40、tice类包:patterns. observer类:public class Notice实现:Notice INoticeNotice负责保存通知的名称、类型、发送者,并提供读写通知的名称、类型、发送者的接口。3.1.1 属性private var name:String; /通知实例的名称private var type:String; /通知实例的类型private var sender:Object; /通知的发送者3.1.2 方法public function Notice( name:String, sender:Object=null, type:String=null ) /
41、创建通知,必须指定通知名称,可不指定通知发送者、通知类型public function getName():String /获取通知的名称,没有setter,只能通过构造函数设定通知的名称/= 读写通知的发送者 =public function setSender( sender:Object ):void public function getSender():Object/= 读写通知类型 =public function setType( type:String ):voidpublic function getType():Stringpublic function toString():String /把通知转化为字符串形式