您好,欢迎访问三七文档
——一个用来开发Flash,Flex,和AIR应用的纯AS3微架构ROBOTLEGSROBOTLEGS•Robotlegs是一套机制,用来将您所创建的对象联接在一起。•Robotlegs的核心是一组模块化的工具集以及界面集,用来简化上述的信息沟通任务,减少重复的代码编写,以及管理应用程序中的依赖注入。除了这些核心工具集以外,Robotlegs还提供了一个比较规范的MVC+S(Model模型,View视图,Controller控件和Service服务)实现。ROBOTLEGSROBOTLEGSMVC+S应用程序的基本结构•一个典型的RobotlegsMVC+S应用程序包含以下几个部分:•Context(上下文)-所谓Context(上下文),实际上是一套自展机制,用来初始化Robotlegs所使用的依赖注入以及各种核心工具。•Mediators(媒介)-所谓Mediators(媒介),是用来管理应用程序中的视图组件与应用程序中的其它对象之间的信息交流。•Commands(命令)-所谓Commands(命令),代表的是应用程序所能执行的独立操作。通常,Commands(命令)会作为对用户操作的反应,但命令的作用并不仅限于此。•Models(模型)-Models(模型)中保存着数据信息,并且表现出应用程序当前的状态。•Services(服务)-Services(服务),是应用程序与外界的接口CONTEXT(上下文)•Context处于应用程序的核心位置。它提供了中央事件总线,使得您其它的应用程序对象之间可以进行信息交流。•它会自发启动,执行自己的功能,并且,伴随者您开发出了程序的核心,它又会悄无声息地自动退出。此外,Context并不是一个单例。应用程序中可以存在自定义数量的Contexts,使得Robotlegs很适合用来开发模块化的应用程序。importorg.robotlegs.mvcs.ContextpublicclassEditorContextextendsContext{publicfunctionEditorContext(){super();}overridepublicfunctionstartup():void{//这个是引导程序super.startup();}}Context当中的一些内容实际上让您重写了程序启动类函数。当Context完全初始化以后,会调用startup()函数。在程序后台,早在调用startup()函数之前,Context就已经创建了全部的Robotlegs核心工具,为接收依赖注入的变换映像作准备,同时还创建了事件调度器,用于应用程序中的各个对象之间的信息交流overridepublicfunctionstartup():void{//ControllercommandMap.mapEvent(BpmnViewerEvent.INIT_REQUEST,BpmnViewerCommand);//Modelinjector.mapSingleton(BpmnViewerModel);//Servicesinjector.mapSingletonOf(IBpmnService,BpmnService);//ViewmediatorMap.mapView(SaveButton,SaveButtonMediator);//Startupcomplete}CONTEXT的引用一旦您创建了一个Context类,您的程序就需要对它进行引用。因为Context是一个不可视的类,所以它必须要放置在Declarations标签中contextview(context视图)是Context的根视图!--因为Context是一个不可视的类,所以它必须要放置在Declarations标签中--fx:Declarationsbpmn:EditorContextcontextView={this}//fx:DeclarationsMEDIATORS(媒介)•Mediators会对事件进行监听。当用户与视图组件进行交互或者视图组件经由其他一些方式进行更新时,这些视图组件都会分派出一些事件。MEDIATORimportorg.robotlegs.mvcs.Mediator;publicclassSaveButtonMediatorextendsMediator{[Inject]//[Inject]元数据标签。这个标签用于让Robotlegs识别那些需要执行注入操作的属性和类函数。publicvarsaveButton:SaveButton;overridepublicfunctiononRegister():void{eventMap.mapListener(saveButton,MouseEvent.CLICK,onClicked);}}privatefunctiononClicked(e:MouseEvent):void{eventDispatcher.dispatchEvent(newBpmnViewerEvent(BpmnViewerEvent.SAVE_BPMN_REQUEST));}MEDIATOR•已经得到了一个视图组件以及一个mediator,它们需要用Context来进行注册和定义映射。这一步操作是通过MediatorMap来实现的。正如其名,MediatorMap是一个将mediators映射到Context的视图组件中去的工具。•overridepublicfunctionstartup():void•{//View•mediatorMap.mapView(SaveButton,SaveButtonMediator);•}•下面将savebutton添加到主应用程序中去COMMANDCommand是短生命周期的无状态对象.它们在被实例化和执行之后立即释放.Command应该只在处理框架事件时被执行,而不应该被任何其他框架actor实例化或执行.Command用于应用程序各层之间相互通讯,也可能用来发送系统事件.这些系统事件既可能发动其它的Command,也可能被一个Mediator接收,然后对一个ViewComponent进行对应这个事件的工作.Command是封装你的应用程序业务逻辑的绝佳场所.被Context的CommandMap注册到ContextcommandMap.mapEvent(BpmnViewerEvent.LOAD_BPMN_REQUEST,BpmnViewerCommand);COMMAND职责•Command被Context的CommandMap注册到Context.CommandMap在Context和Command类里默认可用.•Command类被注册到Context时接收4个参数:一个事件类型;响应这个事件时执行的Command类;可选的事件类;一个是否该Command只被执行一次随即被取消注册而不响应后续事件触发的一次性设置.•触发Command•Command被Mediators,Services,Models,和其它Command广播的框架事件触发.典型的,触发这个Command的事件会被注入到这个Command,以提供对其属性/负载的访问:SERVICEService用来访问应用程序范围之外的资源.这包括但当然不限于:webservices文件系统数据库RESTfulAPIs通过localConnection的其它Flash应用程序Service封装了这些和外部实体的交互,并管理这个交互产生的result,fault或其它事件Service是进入外部数据的第一个点,所以它是操作一个外部服务返回的数据的更好的选择.SERVICE职责一个Service类为你的应用程序提供一个和外部服务交互的API.一个service类将连接外部服务并管理它收到的响应.Service类通常是无状态的实体.他们并不存储从外部服务收到的数据,而是发送框架事件来让合适的框架actor管理响应数据和失败.•Service类提供一个方便的dispatch方法用来发送框架事件:•event=newBpmnViewerModelEvent•(BpmnViewerModelEvent.BPMN_SAVE_FAILED,未定义流程结束节点);•dispatch(event)MODEL•Model类用来管理对应用程序的数据模型的访问.•Model为其它框架actor提供一个API来访问,操作和更新应用程序数据.这个数据包括但不限于原生数据类型比如String,Array,或者像ArrayCollection一样的域特有对象或集合.MODEL职责•一个Model类是你的应用程序数据的看门人.应用程序里的其它actor通过Model提供的API请求数据.因为数据是通过Model更新,Model装备了向框架广播事件的机制以向其它actor通知数据模型的变化使它们得以据此调整自己的状态•除了控制对数据模型的访问,Model通常也被用来保证数据状态的有效性.这包括对数据进行计算,或域特有逻辑的其它领域EVENTMANAGEMENTROBOTLEGS框架介绍ROBOTLEGS框架流程图ROBOTLEGS使用方法参考代码与PUREMVC的比较1.robotlegs没有采用pureMVC的notification机制,而是用AS3的事件分发机制。这可以很容易地让框架支持单元测试。因为最新的FlexUnit4可以用AS3的事件机制进行异步测试。2.pureMVC的Mediator是Singleton,要在程序初始化时手动实例化所有Mediator对象。而robotlegs先绑定View元素和Mediator,当View元素添加到舞台时实例化Mediator对象。这个特性的支持,可以很方便地在运行时动态创建对象。这是pureMVC所做不到的。如果用pureMVC的Mediator去管理一个弹出窗口,因为你不知道何时才会弹出,所以只能在弹出窗口之前进行Mediator的创建和绑定。如果有很多弹出窗口,代码的可读性和代码结构就大大下降。
本文标题:Robotlegs
链接地址:https://www.777doc.com/doc-3352421 .html