PureMVC开发框架使用手册中文版复习过程_第1页
PureMVC开发框架使用手册中文版复习过程_第2页
PureMVC开发框架使用手册中文版复习过程_第3页
PureMVC开发框架使用手册中文版复习过程_第4页
PureMVC开发框架使用手册中文版复习过程_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Good is good, but better carries it.精益求精,善益求善。PureMVC开发框架使用手册中文版-PureMVC开发框架使用手册目录(目录结构=类文件的文件夹结构)1HYPERLINKlh1patterns包1.1HYPERLINKlh11开发框架1.2HYPERLINKlh12框架结构1.3HYPERLINKlh13使用方法1.4HYPERLINKlh14“高内聚低耦合”的实现程序架构要点2HYPERLINKlh2Facade类3HYPERLINKlh3mvc包3.1HYPERLINKlh31Model类3.2HYPERLINKlh32View类3.3HYPE

2、RLINKlh33Controller类4HYPERLINKlh4media包4.1HYPERLINKlh41Proxy类4.2HYPERLINKlh42Mediator类4.3HYPERLINKlh43Command类4.4HYPERLINKlh44Commands类5HYPERLINKlh5observer包5.1HYPERLINKlh51Observer类5.2HYPERLINKlh52Notifier类5.3HYPERLINKlh53Notice类正文1HYPERLINKlh00patterns包是开发框架的顶级包,应该放在程序的类目录的根目录下。1.1HYPERLINKlh00开发框

3、架开发框架就是一个空架子,我们可以自己加工、创造零部件,装配上去,使这个系统按照我们的设计意图运行起来。这个开发框架基于PureMVC框架构建,目标是开发出更健壮、易维护、易扩展、可重用的应用程序。当然,采用这个开发框架并不等于实现了这个目标,要实现这个目标,还需要我们在开发过程中不断调整、不断优化程序架构。实现这个目标的关键是,降低模块间的耦合度。1.2HYPERLINKlh00框架结构这个开发框架分为低耦合的三个层Model、View和Controller。这三部分由三个单例模式类管理,三者合称为核心层。还有一个单例模式类Faade,是整个系统的管理者。简单地说,就是三个核心层、一个管理者

4、,其余的就是零部件,可以按需增减。其架构如下图所示:其中:Model负责保存Proxy名称与实例的映射,根据Proxy名称获取其实例。Proxy负责保存数据对象,存取数据。View负责保存Mediator名称与实例的映射、Notice名称与观察者的映射,根据Mediator名称获取其实例,根据Notice通知其观察者。Mediator负责保存视图组件,操作具体的视图组件,处理通知。观察者负责保存通知的处理者及其处理方法,收到通知则告知其处理者处理这个通知。Controller负责保存Notice名称与Command类的映射,执行通知对应的Command。Command负责执行业务逻辑处理通知。

5、Faade是框架的管理者和通信中心,是框架与外界通信的唯一接口,负责初始化Model、View、Controller单例,发送通知。1.3HYPERLINKlh00使用方法开发框架只是搭建了一个空架子,我们所要做的就是编写具体的Command、Mediator、Proxy等这些零部件,给它们添加自定义属性和方法,保存到Model、View、Controller中。在没有保存Proxy、Mediator和Observer、Command时,Model、View、Controller就是一个空架子。通常,我们需要自定义视图组件:影片剪辑或声音放在Flash库中,它们对应的类文件放在包中,Flash

6、的舞台就是一个自定义视图组件,文档类就是舞台对应的类文件。有时,还需要自定义事件、声音对象、数据对象等等。1.4HYPERLINKlh00“高内聚低耦合”的实现程序架构要点1.4.1什么是高内聚低耦合?简单地说,就是模块之间不直接互相操作,而是通过中介:通知、事件来实现互操作。举例一:程序中有两个对象A、B,当A发生变化时,需要B随之变化。如果A发生变化时,只发出通知或触发事件,B负责响应,那么A、B之间就是低耦合关系。A、B不必知道对方的实现细节。如果A发生变化时,直接调用B的接口,使B发生相应变化,并获取操作结果,那么A、B之间就是强耦合关系。A、B需要知道对方的一些实现细节(属性或方法)

7、。举例二:球场上打比赛,As是裁判、Bs是球员,As与Bs需要合作。如果比赛需要暂停,As只是吹哨,Bs听到号令就停下来,那么As、Bs之间就是低耦合关系。As、Bs不必抓住对方手脚。如果比赛需要暂停,As直接走过去把Bs控制住,使Bs无法继续行动,那么As、Bs之间就是强耦合关系。1.4.2实现手段程序架构要点1、采用事件模型2、采用通知机制3、事件模型和通知机制的结合2HYPERLINKlh00Facade类包:patterns类:publicclassFaade实现:FaadeIFacadeFaade是框架的管理者和通信中心,是框架与外界通信的唯一接口,放在顶级包中,负责初始化Model

8、、View、Controller单例,发送通知。2.1属性/=只允许自己和子类访问=protectedvarmodel:Model;/Model单例protectedvarview:View;/View单例protectedvarcontroller:Controller;/Controller单例protectedstaticvarinstance:Facade;/Facade单例protectedconstSINGLETON_MSG:String=Facadealreadyexist!;/消息常量(通常,在自定义Faade类中定义通知名称常量。因为系统全局都要用。)2.2方法publicf

9、unctionFacade()/构造函数,由于Facade是单例,所以应调用单例工厂方法Facade.getInstance(),而不能直接调用该构造函数,否则会抛出异常protectedfunctioninitFacade():void/初始化Facade单例,子类可追加不要替换publicstaticfunctiongetInstance():Faade/Facade单例工厂方法/=创建三个核心层=protectedfunctioninitModel():void/在自定义Faade子类中,若想创建自定义Model并且自定义Proxy初始化时不需要引用Facade,可以重写这个方法,否则就

10、先调用这个方法,再注册Proxy。注意:这个方法很少被重写,实践中,你更喜欢用command创建并注册Proxy,因为存有可变数据的Proxy很可能需要发送Notice,因此在创建时需要引用Facade。protectedfunctioninitView():void/在自定义Faade子类中,若想创建自定义View,或想注册自定义Observers,可以重写这个方法,否则就先调用这个方法,再注册Mediator。注意:这个方法很少被重写,实践中你更可能使用command创建并注册Mediator,因为Mediator实例需要发送Notice,因此在创建时需要引用Faade。protected

11、functioninitController():void/在自定义Facade子类中,若想创建自定义Controller,可以重写这个方法,否则就先调用这个方法,再注册command/=与Model层的交互=publicfunctionaddProxy(proxy:IProxy):void/添加proxy实例到Model中publicfunctionretrieveProxy(proxyName:String):IProxy/从Model中获取proxy实例publicfunctionremoveProxy(proxyName:String):IProxy/从Model中移除proxy实例p

12、ublicfunctionhasProxy(proxyName:String):Boolean/判断Model中是否有proxy实例/=与View层的交互=publicfunctionaddMediator(mediator:IMediator):void/添加mediator实例到View中publicfunctionretrieveMediator(mediatorName:String):IMediator/从View中获取mediator实例publicfunctionremoveMediator(mediatorName:String):IMediator/从View中移除media

13、tor实例publicfunctionhasMediator(mediatorName:String):Boolean/判断View中是否有mediator实例/=与Controller层的交互=publicfunctionaddCommand(noticeName:String,cmd:Class):void/添加Command类到Controller中publicfunctionremoveCommand(noticeName:String):void/从Controller中移除noticeName对应的Command类publicfunctionhasCommand(noticeNam

14、e:String):Boolean/判断Controller中是否有noticeName对应的Command类/=与Observer的交互,实现通信机制=publicfunctionsendNotice(noticeName:String,body:Object=null,type:String=null):void/创建并发送一个通知,这样,我们在实现代码中,就不用再创建通知实例了。publicfunctionnotifyObservers(notice:INotice):void/公开这个方法,主要是为了向下兼容,允许你使用faade发送自定义通知。通常,你可以只调用sendNotice方

15、法,根本不需要自己创建通知。3HYPERLINKlh00mvc包只有三个核心类,是三个单例,分别实现MVC三个核心层,是框架的主体(media是配件),不可增减。3.1HYPERLINKlh00Model类包:patterns.mvc类:publicclassModel实现:ModelIModel负责保存Proxy名称与实例的映射,根据Proxy名称获取其实例。3.1.1属性/=只允许自己和子类访问=protectedvarproxyMap:Object;/保存Proxy名称与实例的映射protectedstaticvarinstance:Model;/Model单例protectedcons

16、tSINGLETON_MSG:String=Modelalreadyexist!;/消息常量3.1.2方法publicfunctionModel()/Model是单例,不能直接调用该构造函数,而应该调用单例工厂方法Model.getInstance(),否则抛出异常protectedfunctioninitModel():void/自动被构造函数调用,若自定义子类,则在这里添加自定义内容,而不必override构造函数publicstaticfunctiongetInstance():Model/Model的单例工厂静态方法/=操作Proxy实例的接口=publicfunctionaddPro

17、xy(proxy:IProxy):void/把Proxy实例赋值给proxyMap的属性,Proxy的名称作为proxyMap属性名publicfunctionretrieveProxy(proxyName:String):IProxy/以proxyName为关键字,获取proxyMap的属性对应的Proxy实例publicfunctionremoveProxy(proxyName:String):IProxy/把proxyMap的属性名为proxyName的属性干掉publicfunctionhasProxy(proxyName:String):Boolean/判断proxyMap的属性名为

18、proxyName的属性是否存在3.2HYPERLINKlh00View类包:patterns.mvc类:publicclassView实现:ViewIViewView负责保存Mediator名称与实例的映射、Notice名称与观察者的映射,根据Mediator名称获取其实例,根据Notice通知其观察者。3.2.1属性/=只允许自己和子类访问=protectedvarmediatorMap:Object;/存储Mediator名称到Mediator实例的映射protectedvarobserverMap:Object;/存储Notice名称到观察者列表的映射protectedstaticva

19、rinstance:View;/View单例protectedconstSINGLETON_MSG:String=Viewalreadyexist!;/消息常量3.2.2方法publicfunctionView()/View是单例,不能直接调用该构造函数,而应调用单例工厂方法View.getInstance(),否则会抛出异常protectedfunctioninitView():void/自动被构造函数调用,若自定义子类,就在这里设定自定义内容,而不必override构造函数publicstaticfunctiongetInstance():View/View的单例工厂方法/=对观察者的操作

20、=publicfunctionaddObserver(noticeName:String,observer:IObserver):void/把observer存入观察者列表中,收到通知,就遍历对应的观察者列表,通知各个observerpublicfunctionnotifyObservers(notice:INotice):void/通知notice的观察者列表中的所有观察者publicfunctionremoveObserver(noticeName:String,processor:Object):void/根据processor从noticeName的观察者列表中移除观察者/=对Medi

21、ator的操作=publicfunctionaddMediator(mediator:IMediator):void/首先把Mediator实例赋值给mediatorMap的属性,mediatorName作为属性名。然后,通过名称获取Mediator实例,并进一步查询它所关心的Notice。若返回Notice列表,则创建观察者(封装Mediator实例及其handleNotice方法),把观察者注册给列表中的每个Notice。最后,触发Mediator实例的被注册事件。publicfunctionretrieveMediator(mediatorName:String):IMediator/根

22、据Mediator名称获取Mediator实例publicfunctionremoveMediator(mediatorName:String):IMediator/首先根据Mediator名称获取Mediator实例,若该Mediator实例存在,则查询该mediator实例所关心的Notice,把mediator实例相关的观察者从notice的观察者列表中删除。然后,把该mediator实例从mediatorMap中删除。最后,触发mediator实例的被删除事件。publicfunctionhasMediator(mediatorName:String):Boolean/判断View的m

23、ediatorMap中是否有这个mediator实例3.3HYPERLINKlh00Controller类包:patterns.mvc类:publicclassController实现:ControllerIControllerController负责保存Notice名称与Command类的映射,执行通知对应的Command。3.3.1属性/=只允许自己和子类访问=protectedvarview:View;/对View单例的引用protectedvarcommandMap:Object;/存储通知名称与Command类的映射protectedstaticvarinstance:Control

24、ler;/Controller单例protectedconstSINGLETON_MSG:String=Controlleralreadyexist!;/消息常量3.3.2方法/=创建Controller=publicfunctionController()/Controller是单例,不能直接调用该构造函数,而应调用单例工厂方法Controller.getInstance(),否则会抛出异常protectedfunctioninitController():void/自动被构造函数调用,可由子类覆盖,添加自定义内容,而不覆盖构造函数。注意:若自定义View的子类,则也应定义Controlle

25、r的子类,并override这个方法,象这样:view=MyView.getInstance();publicstaticfunctiongetInstance():Controller/Controller的单例工厂方法/=操作Command=publicfunctionexecuteCommand(note:INotice):void/执行note对应的Command。首先根据note名称,获取command类,然后,创建command实例,执行command业务逻辑。publicfunctionaddCommand(noteName:String,cmd:Class):void/把Com

26、mand类赋值给commandMap的属性,属性名为noteName。若某个noteName还没Command,则先给note添加观察者。若某个noteName已有Command,则用新command替换旧的。因为一个note,只能有一个处理者,否则就乱套了。publicfunctionhasCommand(noteName:String):Boolean/判断noteName是否有对应的CommandpublicfunctionremoveCommand(noteName:String):void/从Notice映射中移除注册的Command。首先移除观察者,再干掉command。4HYPE

27、RLINKlh00media包是一些中介人,它们是核心层与外界通信的代理人,是框架的配件(mvc是主体),可增减。我们的工作就是给这些配件添加自定义属性和行为,来实现我们的需求。4.1HYPERLINKlh00Proxy类包:patterns.media类:publicclassProxy继承:ProxyNotifier实现:ProxyIProxy,INotifierProxy是Model的助理,负责保存数据对象,存取数据,可发送通知。4.1.1属性publicstaticvarNAME:String=Proxy;/Proxy名称常量protectedvarproxyName:String;/

28、Proxy实例名称protectedvardata:Object;/数据对象4.1.2方法/=访问Proxy=publicfunctionProxy(proxyName:String=null,data:Object=null)/构造函数,保证proxyName有值,不保证datapublicfunctiongetProxyName():String/获取Proxy名称。在Model中,需要根据Proxy名称来获取Proxy实例/=访问数据对象=publicfunctionsetData(data:Object):void/设定数据对象publicfunctiongetData():Objec

29、t/读取数据对象/=生死关头处理一下=publicfunctiononAdd():void/创建Proxy时publicfunctiononRemove():void/移除Proxy时4.2HYPERLINKlh01Mediator类包:patterns.media类:publicclassMediator继承:MediatorNotifier实现:MediatorIMediator,INotifierMediator是View的助理,负责保存视图组件,操作具体的视图组件,处理通知。4.2.1属性publicstaticconstNAME:String=Mediator;/Mediator名称

30、常量,通常,Mediator用于控制特定的一个或一组视图组件,不需要动态命名protectedvarmediatorName:String;/Mediator实例名称protectedvarviewComponent:Object;/保存视图组件4.2.2方法/=访问Mediator=publicfunctionMediator(mediatorName:String=null,viewComponent:Object=null)/构造函数,保证mediatorName有值,不保证viewComponent。也就是说,可以不指定视图。publicfunctiongetMediatorName(

31、):String/获取mediator名称。在View中,需要根据mediator名称来获取mediator实例/=读写视图组件=publicfunctionsetViewComponent(viewComponent:Object):void/设定mediator要处理的视图组件publicfunctiongetViewComponent():Object/获取mediator要处理的视图组件/=处理Notice=publicfunctionlistNoticeInterests():Array/列出mediator关注的通知publicfunctionhandleNotice(notice

32、:INotice):void/收到通知进行处理/=生死瞬间处理一下=publicfunctiononAdd():void/添加mediator实例时publicfunctiononRemove():void/移除mediator实例时4.3HYPERLINKlh01Command类包:patterns.media类:publicclassCommand继承:CommandNotifier实现:CommandICommand,INotifierCommand是Controller的助理,负责执行单个业务逻辑处理通知。由用户动作触发一个通知,该通知由Command的execute方法来处理。4.3

33、.1属性无4.3.2方法publicfunctionexecute(note:INotice):void/应在子类中override该方法,添加自定义业务逻辑,处理通知。4.4HYPERLINKlh01Commands类包:patterns.media类:publicclassCommands继承:CommandsNotifier实现:CommandsICommand,INotifierCommands也是Controller的助理,负责执行一系列Command处理通知。维护一个Command列表subCmds。execute时,Commands会按顺序实例化subCmds中的Command,

34、并调用其execute方法。4.4.1属性privatevarsubCmds:Array;/Command列表,是个FIFO表4.4.2方法/=创建Commands=publicfunctionCommands()/在子类中,不必自定义构造函数,而是重写initializeMacroCommand方法,若想自定义构造函数,必须调用superprotectedfunctioninitializeCmds():void/在子类中重写该方法,给Command列表添加Command。注意:Command可以是Command或Commands。protectedfunctionaddSubCmd(cmd

35、Ref:Class):void/给Command列表添加Command/=执行Commands=publicfinalfunctionexecute(note:INotification):void/执行Command列表中的所有Command,禁止override该方法5HYPERLINKlh01observer包用于实现通知通信机制。不依赖Flash中的事件模型,而且AS3并没有内置的事件模型。采用观察者模式,实现模块之间的事件驱动通信。Flash事件和PureMVC通知的主要差异是:事件遵循“责任链”模式,在显示层级中“冒泡”直到有父组件处理它;而通知遵循“发布/订阅”模式。使用通知进行

36、通信,PureMVC各模块之间不需要建立父子关系。通知并不是事件的替代物。一般情况下,Mediator给其视图组件添加事件侦听器,按常用方式处理,然后给目标Command广播Notice,或与其他Mediator通信。Proxy通过广播Notice,与Command实例和Mediator通信。5.1HYPERLINKlh01Observer类包:patterns.observer类:publicclassObserver实现:ObserverIObserverObserver负责保存通知的处理者及其处理方法,收到通知则告知其处理者处理这个通知。5.1.1属性privatevarprocessF:Function;/处理函数负责处理通知privatevarprocessO:Object;/处理者负责调用处理通知的方法5.1.2方法publicfunctionObserver(processFunc:Function,processor:Object)/构造函数,设定处理者和处理函数/=读写processFunc=publicfu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论