ureMVC开发框架使用手册中_第1页
ureMVC开发框架使用手册中_第2页
ureMVC开发框架使用手册中_第3页
ureMVC开发框架使用手册中_第4页
ureMVC开发框架使用手册中_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、PureMVC开发框架使用手册目录(目录结构=类文件的文件夹结构)1 HYPERLINK l h1 patterns包1.1 HYPERLINK l h11 开发框架1.2 HYPERLINK l h12 框架结构1.3 HYPERLINK l h13 使用方法1.4 HYPERLINK l h14 “高内聚低耦合”的实现程序架构要点2 HYPERLINK l h2 Facade类3 HYPERLINK l h3 mvc包3.1 HYPERLINK l h31 Model类3.2 HYPERLINK l h32 View类3.3 HYPERLINK l h33 Controller类4 HYP

2、ERLINK l h4 media包4.1 HYPERLINK l h41 Proxy类4.2 HYPERLINK l h42 Mediator类4.3 HYPERLINK l h43 Command类4.4 HYPERLINK l h44 Commands类5 HYPERLINK l h5 observer包5.1 HYPERLINK l h51 Observer类5.2 HYPERLINK l h52 Notifier类5.3 HYPERLINK l h53 Notice类正文1 HYPERLINK l h00 patterns包是开发框架的顶级包,应该放在程序的类目录的根目录下。1.1

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

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

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

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

7、就是强耦合关系。A、B需要知道对方的一些实现细节(属性或方法)。举例二:球场上打比赛,As是裁判、Bs是球员,As与Bs需要合作。如果比赛需要暂停,As只是吹哨,Bs听到号令就停下来,那么As、Bs之间就是低耦合关系。As、Bs不必抓住对方手脚。如果比赛需要暂停,As直接走过去把Bs控制住,使Bs无法继续行动,那么As、Bs之间就是强耦合关系。 实现手段程序架构要点1、采用事件模型2、采用通知机制3、事件模型和通知机制的结合2 HYPERLINK l h00 Facade类包:patterns类:public class Faade实现:FaadeIFacadeFaade是框架的管理者和通信中

8、心,是框架与外界通信的唯一接口,放在顶级包中,负责初始化Model、View、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 e

9、xist!; /消息常量(通常,在自定义Faade类中定义通知名称常量。因为系统全局都要用。)2.2 方法public function Facade() /构造函数,由于Facade是单例,所以应调用单例工厂方法Facade.getInstance(),而不能直接调用该构造函数,否则会抛出异常protected function initFacade():void /初始化Facade单例,子类可追加不要替换public static function getInstance():Faade / Facade单例工厂方法/= 创建三个核心层 = protected function init

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

11、写,实践中你更可能使用command创建并注册Mediator,因为Mediator实例需要发送Notice,因此在创建时需要引用Faade。protected function initController():void /在自定义Facade子类中,若想创建自定义Controller,可以重写这个方法,否则就先调用这个方法,再注册command/= 与Model层的交互 =public function addProxy ( proxy:IProxy ):void /添加proxy实例到Model中public function retrieveProxy ( proxyName:Stri

12、ng ):IProxy /从Model中获取proxy实例public 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( medi

13、atorName:String ):IMediator /从View中获取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 /添加Com

14、mand类到Controller中public function removeCommand( 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

15、:String=null ):void /创建并发送一个通知,这样,我们在实现代码中,就不用再创建通知实例了。public function notifyObservers( notice:INotice ):void /公开这个方法,主要是为了向下兼容,允许你使用faade发送自定义通知。通常,你可以只调用sendNotice方法,根本不需要自己创建通知。3 HYPERLINK l h00 mvc包只有三个核心类,是三个单例,分别实现MVC三个核心层,是框架的主体(media是配件),不可增减。3.1 HYPERLINK l h00 Model类包:patterns.mvc类:public

16、class Model实现:Model IModel负责保存Proxy名称与实例的映射,根据Proxy名称获取其实例。 属性/= 只允许自己和子类访问 =protected var proxyMap:Object; /保存Proxy名称与实例的映射protected static var instance:Model; /Model单例protected const SINGLETON_MSG:String = Model already exist!; /消息常量 方法public function Model() /Model是单例,不能直接调用该构造函数,而应该调用单例工厂方法Model

17、.getInstance(),否则抛出异常protected function initModel():void /自动被构造函数调用,若自定义子类,则在这里添加自定义内容,而不必override构造函数public static function getInstance():Model /Model的单例工厂静态方法/= 操作Proxy实例的接口 =public function addProxy( proxy:IProxy ):void /把Proxy实例赋值给proxyMap的属性,Proxy的名称作为proxyMap属性名public function retrieveProxy( p

18、roxyName:String ):IProxy /以proxyName为关键字,获取proxyMap的属性对应的Proxy实例public function removeProxy( proxyName:String ):IProxy /把proxyMap的属性名为proxyName的属性干掉public function hasProxy( proxyName:String ):Boolean /判断proxyMap的属性名为proxyName的属性是否存在3.2 HYPERLINK l h00 View类包:patterns.mvc类:public class View实现:ViewIV

19、iewView负责保存Mediator名称与实例的映射、Notice名称与观察者的映射,根据Mediator名称获取其实例,根据Notice通知其观察者。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 = Vie

20、w already exist!; /消息常量3.2.2 方法public function View() /View是单例,不能直接调用该构造函数,而应调用单例工厂方法View.getInstance(),否则会抛出异常protected function initView():void /自动被构造函数调用,若自定义子类,就在这里设定自定义内容,而不必override构造函数public static function getInstance():View /View的单例工厂方法/= 对观察者的操作 =public function addObserver( noticeName:Str

21、ing, observer:IObserver ):void /把observer存入观察者列表中,收到通知,就遍历对应的观察者列表,通知各个observerpublic function notifyObservers( notice:INotice ):void /通知notice的观察者列表中的所有观察者public function removeObserver( noticeName:String, processor:Object ):void /根据processor从noticeName的观察者列表中移除观察者/= 对Mediator的操作 =public function a

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

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

24、orMap中是否有这个mediator实例3.3 HYPERLINK l h00 Controller类包:patterns.mvc类:public class Controller实现:ControllerIControllerController负责保存Notice名称与Command类的映射,执行通知对应的Command。3.3.1 属性/= 只允许自己和子类访问 =protected var view:View; /对View单例的引用protected var commandMap:Object; /存储通知名称与Command类的映射protected static var ins

25、tance:Controller; /Controller单例protected const SINGLETON_MSG:String = Controller already exist!; /消息常量3.3.2 方法/= 创建Controller =public function Controller() /Controller是单例,不能直接调用该构造函数,而应调用单例工厂方法Controller.getInstance(),否则会抛出异常protected function initController():void /自动被构造函数调用,可由子类覆盖,添加自定义内容,而不覆盖构造函数

26、。注意:若自定义View的子类,则也应定义Controller的子类,并override这个方法,象这样:view = MyView.getInstance();public static function getInstance():Controller / Controller的单例工厂方法/= 操作Command =public function executeCommand( note:INotice ):void /执行note对应的Command。首先根据note名称,获取command类,然后,创建command实例,执行command业务逻辑。public function a

27、ddCommand( noteName:String, cmd:Class ):void /把Command类赋值给commandMap的属性,属性名为noteName。若某个noteName还没Command,则先给note添加观察者。若某个noteName已有Command,则用新command替换旧的。因为一个note,只能有一个处理者,否则就乱套了。public function hasCommand( noteName:String ):Boolean /判断noteName是否有对应的Commandpublic function removeCommand( noteName:St

28、ring ):void /从Notice映射中移除注册的Command。首先移除观察者,再干掉command。4 HYPERLINK l h00 media包是一些中介人,它们是核心层与外界通信的代理人,是框架的配件(mvc是主体),可增减。我们的工作就是给这些配件添加自定义属性和行为,来实现我们的需求。4.1 HYPERLINK l h00 Proxy类包:patterns.media类:public class Proxy继承:ProxyNotifier实现:Proxy IProxy, INotifierProxy是Model的助理,负责保存数据对象,存取数据,可发送通知。4.1.1 属性

29、public static var NAME:String = Proxy; /Proxy名称常量protected var proxyName:String; / Proxy实例名称protected var data:Object; /数据对象4.1.2 方法/= 访问Proxy =public function Proxy( proxyName:String=null, data:Object=null ) /构造函数,保证proxyName有值,不保证datapublic function getProxyName():String /获取Proxy名称。在Model中,需要根据Pro

30、xy名称来获取Proxy实例/= 访问数据对象 =public function setData( data:Object ):void /设定数据对象public function getData():Object /读取数据对象/= 生死关头处理一下 =public function onAdd():void /创建Proxy时public function onRemove( ):void /移除Proxy时4.2 HYPERLINK l h01Mediator类包:patterns. media类:public class Mediator继承:Mediator Notifier实现:

31、Mediator IMediator, INotifierMediator是View的助理,负责保存视图组件,操作具体的视图组件,处理通知。4.2.1 属性public static const NAME:String = Mediator; /Mediator名称常量,通常,Mediator用于控制特定的一个或一组视图组件,不需要动态命名protected var mediatorName:String; / Mediator实例名称protected var viewComponent:Object; /保存视图组件4.2.2 方法/= 访问Mediator =public functio

32、n Mediator( mediatorName:String=null, viewComponent:Object=null ) /构造函数,保证mediatorName有值,不保证viewComponent。也就是说,可以不指定视图。public function getMediatorName():String /获取mediator名称。在View中,需要根据mediator名称来获取mediator实例/= 读写视图组件 =public function setViewComponent( viewComponent:Object ):void /设定mediator要处理的视图组件

33、public function getViewComponent():Object /获取mediator要处理的视图组件/= 处理Notice =public function listNoticeInterests():Array /列出mediator关注的通知public function handleNotice( notice:INotice ):void /收到通知进行处理/= 生死瞬间处理一下 =public function onAdd( ):void /添加mediator实例时public function onRemove( ):void /移除mediator实例时4

34、.3 HYPERLINK l h01 Command类包:patterns. media类:public class Command继承:Command Notifier实现:Command ICommand, INotifierCommand是Controller的助理,负责执行单个业务逻辑处理通知。由用户动作触发一个通知,该通知由Command的execute方法来处理。4.3.1 属性无4.3.2 方法public function execute( note:INotice ):void /应在子类中override该方法,添加自定义业务逻辑,处理通知。4.4 HYPERLINK l

35、h01 Commands类包:patterns. media类:public class Commands继承:Commands Notifier实现:Commands ICommand, INotifierCommands也是Controller的助理,负责执行一系列Command处理通知。维护一个Command列表subCmds。execute时,Commands会按顺序实例化subCmds中的Command,并调用其execute方法。4.4.1 属性private var subCmds:Array; /Command列表,是个FIFO表4.4.2 方法/= 创建Commands =p

36、ublic function Commands() /在子类中,不必自定义构造函数,而是重写initializeMacroCommand方法,若想自定义构造函数,必须调用superprotected function initializeCmds():void /在子类中重写该方法,给Command列表添加Command。注意:Command可以是Command或Commands。protected function addSubCmd( cmdRef:Class ): void /给Command列表添加Command/= 执行Commands =public final function

37、execute( note:INotification ) : void /执行Command列表中的所有Command,禁止override该方法5 HYPERLINK l h01 observer包用于实现通知通信机制。不依赖Flash中的事件模型,而且AS3并没有内置的事件模型。采用观察者模式,实现模块之间的事件驱动通信。Flash事件和PureMVC通知的主要差异是:事件遵循“责任链”模式,在显示层级中“冒泡”直到有父组件处理它;而通知遵循“发布/订阅”模式。使用通知进行通信,PureMVC各模块之间不需要建立父子关系。通知并不是事件的替代物。一般情况下,Mediator给其视图组件添

38、加事件侦听器,按常用方式处理,然后给目标Command广播Notice,或与其他Mediator通信。Proxy通过广播Notice,与Command实例和Mediator通信。5.1 HYPERLINK l h01 Observer类包:patterns. observer类:public class Observer实现:Observer IObserverObserver负责保存通知的处理者及其处理方法,收到通知则告知其处理者处理这个通知。5.1.1 属性private var processF:Function; /处理函数负责处理通知private var processO:Object; /处理者负责调用处理通知的方法5.1.2 方法public function Observer( processFunc:Function, processor:Object ) /构造函数,设定处理者和处理函数/= 读写processFunc =public function setPro

温馨提示

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

评论

0/150

提交评论