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 patterns包是开发框架的顶级包,应该放在程序的类目录的根目录下。1.1 开发框架开发框架就是一个空架子,我们可以自己加工、创造零部件,装配上去,使这个系统按照我们的设计意图运行起来。这个开发框架基于PureMVC框架构建,目标是开发出更健壮、易维护、易扩展、可重用的应用程序。当然,采用这个开发框架并不等于实现了这个目标,要实现这个目标,还需要我们在开发过程中不断调整、不断优化程序架构。实现这个目标的关键是,降低模块间的耦合度。1.2 框架结构这个开发框架分为低耦合的三个层Model、View和Controller。这三部分由三个单例模式类管理,三者合称为核心层。还有一个单例模式类Faade,是整个系统的管理者。简单地说,就是三个核心层、一个管理者,其余的就是零部件,可以按需增减。其架构如下图所示:其中: Model负责保存Proxy名称与实例的映射,根据Proxy名称获取其实例。Proxy负责保存数据对象,存取数据。 View负责保存Mediator名称与实例的映射、Notice名称与观察者的映射,根据Mediator名称获取其实例,根据Notice通知其观察者。Mediator负责保存视图组件,操作具体的视图组件,处理通知。观察者负责保存通知的处理者及其处理方法,收到通知则告知其处理者处理这个通知。 Controller负责保存Notice名称与Command类的映射,执行通知对应的Command。Command负责执行业务逻辑处理通知。 Faade是框架的管理者和通信中心,是框架与外界通信的唯一接口,负责初始化Model、View、Controller单例,发送通知。1.3 使用方法开发框架只是搭建了一个空架子,我们所要做的就是编写具体的Command、Mediator、Proxy等这些零部件,给它们添加自定义属性和方法,保存到Model、View、Controller中。在没有保存Proxy、Mediator和Observer、Command时,Model、View、Controller就是一个空架子。通常,我们需要自定义视图组件:影片剪辑或声音放在Flash库中,它们对应的类文件放在包中,Flash的舞台就是一个自定义视图组件,文档类就是舞台对应的类文件。有时,还需要自定义事件、声音对象、数据对象等等。1.4 “高内聚低耦合”的实现程序架构要点1.4.1 什么是高内聚低耦合?简单地说,就是模块之间不直接互相操作,而是通过中介:通知、事件来实现互操作。举例一:程序中有两个对象A、B,当A发生变化时,需要B随之变化。如果A发生变化时,只发出通知或触发事件,B负责响应,那么A、B之间就是低耦合关系。A、B不必知道对方的实现细节。如果A发生变化时,直接调用B的接口,使B发生相应变化,并获取操作结果,那么A、B之间就是强耦合关系。A、B需要知道对方的一些实现细节(属性或方法)。举例二:球场上打比赛,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、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 exist!" /消息常量(通常,在自定义Faade类中定义通知名称常量。因为系统全局都要用。)2.2 方法public function Facade() /构造函数,由于Facade是单例,所以应调用单例工厂方法Facade.getInstance(),而不能直接调用该构造函数,否则会抛出异常protected function initFacade():void /初始化Facade单例,子类可追加不要替换public static function getInstance():Faade / Facade单例工厂方法/= 创建三个核心层 = protected function initModel():void /在自定义Faade子类中,若想创建自定义Model并且自定义Proxy初始化时不需要引用Facade,可以重写这个方法,否则就先调用这个方法,再注册Proxy。注意:这个方法很少被重写,实践中,你更喜欢用command创建并注册Proxy,因为存有可变数据的Proxy很可能需要发送Notice,因此在创建时需要引用Facade。protected function initView():void /在自定义Faade子类中,若想创建自定义View,或想注册自定义Observers,可以重写这个方法,否则就先调用这个方法,再注册Mediator。注意:这个方法很少被重写,实践中你更可能使用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:String ):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( mediatorName: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 /添加Command类到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:String=null ):void /创建并发送一个通知,这样,我们在实现代码中,就不用再创建通知实例了。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 属性/= 只允许自己和子类访问 =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 func