RobotLegs框架解析


RobotLegs框架解析

一,优点:
解耦,维护,统一规范利于分工合作。

二,框架思想 :基于Model-View-Controller元设计模式+S(service:用于接收外部数据与外部通讯

ü 自动依赖注入(Automated Dependency Injection),不用对象自己创建、获取依赖的对象,而是由容器/框架来完成。
ü 命令模式(Command Pattern),
n 命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开;
n 每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
n 命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
ü 调度者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。

三,组成结构:

Context: extends Context:
提供其它层进行通讯的机制,
一个应用程序并非只能使用一个 Context, 但大多情况下一个 Context 就足够了
创建模块化应用程序, 多个 Context 就是必须的了

implements IContext
// 一般在此初始化映射和配置
override public function startup():void

与之相对的事件为ContextEvent类。
传入的文档类this会被绑定到contextView,contextView 可以提供DisplayObjectContainer对象相关操作

 


Controller & Commands:extends Commands
Controller 层由 Command 类体现. Command 是用来执行应用程序单一单位工作的, 无状态的, 短生命周期的对象. Command 用于应用程序各层之间相互通讯, 也可能用来发送系统事件. 这些系统事件既可能发动其它的 Command, 也可能被一个 Mediator 接收,然后对一个 View Component 进行对应这个事件的工作. Command 是封装你的应用程序业务逻辑的绝佳场所.

Command 是短生命周期的无状态对象. 它们在被实例化和执行之后立即释放. Command 应该只在处理框架事件时被执行, 而不应该被任何其他框架 actor 实例化或执行.
Command 是解耦一个应用程序里各个 actor 的非常有用的机制. 因为一个 Command 永远不会被 Mediator, Model 或者 Service 实例化或执行, 这些类也就不会被耦合到 command, 甚至都不知道 command 的存在.

为了履行它们的职责, Command 可能:
映射 Mediator, Model, Service, 或者 Context 里的其它 Command
广播可能被 Mediator 接收或者触发其它 Command 的事件.
被注入Model, Service, 和Mediator 以直接进行工作.


View & Mediators:extends Mediator
View 由 Mediator 类体现. 继承 Mediator 的类用来处理框架和 View Component 之间的交互. 一个 Mediator 将会监听框架事件和 View Component 事件, 并在处理所负责的 View Component 发出的事件时发送框架事件. 这样开发者可以将应用程序特有的逻辑放到 Mediator, 而避免把 View Component 耦合到特定的应用程序.

Mediator 类用来作为用户交互和系统的 View Component 之间的中介
映射通常在持有 contextView 引用的 Context 的 setup() 方法里完成
覆写 onRegister 是添加此 Mediator 关心的任何系统或 View Component 事件
监听:Mediators 装备了一个有 mapListener() 方法的 EventMap.
发送事件:dispatch(new SomeEvent(SomeEvent.YOU_WILL_WANT_THIS, myViewComponent.someData))
建议通过 model 和 service 实现的接口将 model 和 service 注入 mediator. 但不要注入command或者其它meditor,command只能通过事件监听来处理!

Model, Service and the Actor:
MVCS 架构里的 service 和 model 在概念上有着非常多的相似之处. 因为这种相似性, model 和 service 继承了同样的 Actor 基类. 继承 Actor 基类可以获得很多应用程序架构内的功能. 在 MVCS 的 context 里, 我们通过利用继承 Actor 基类来定义应用程序所需要用来管理数据以及和外界通讯的 model 和 service 类. 本文档将把 model 和 service 类分别叫做 Model 和 Service.


Model:extends Actor

Model 类用来在 model 层对数据进行封装并为其提供 API. Model 会在对数据模型进行某些工作之后发出事件通知. Model 通常具有极高的便携性.
有很多理由派发一个事件, 包括但不限于:

数据已被初始化并准备好被其它 actor 使用
一些数据片被添加到 Model
数据被从 Model 中删除
数据已改变或者更新
数据相关的状态已改变


Service:extends Actor

一个 service 层的 Service 用来和"外面的世界"进行通讯. Web service, 文件存取, 或者其它任何应用程序范围之外的行为对 service 类都很适合. Service 类在处理外部事件时会广播系统事件. 一个 service 应该封装和外部服务的交互且具有非常高的便携性.
Service 用来访问应用程序范围之外的资源. 这包括但当然不限于:
web services
文件系统
数据库
通过 localConnection 的其它 Flash 应用程序


注意:
Mediator, Service, Model 可以发送事件,model 和 service 不应该监听和处理事件. 这样做会把它们紧耦合到应用程序特有逻辑而降低潜在的便携性和复用性.
Command. Mediator 是唯一接收框架事件

 


四,事件机制:
robotlegs里使用了flash的事件机制来通信,而puremvc使用自定的通知来发消息!(这个要注意,所以要对flash的事件机制要有一定的了解,以便自定义用户event事件)
Robotlegs 不支持事件冒泡, 因为它并不依赖 Flash 显示列表作为 event bus

注意:了解 Event事件机制.(clone方法)
http://www.cnblogs.com/tankaixiong/archive/2012/12/12/2814272.html

 

五,了解 SwiftSuspenders
Robotlegs采用一种适配器(adapter)机制来为框架提供依赖注入机制。默认地,框架配备了SwiftSuspenders注入/反射库来适合这个要求。

SwiftSuspenders 支持三种类型的依赖注入:
ü 属性(域)注入
ü 参数(方法/设值) 注入
ü 构造注入

特别介绍属性注入,以及在 Robotlegs 里如何使用。将属性注入类有两种选择,你可以使用未命名,或命名的注入:
[Inject]
public var myDependency:Depedency; //未命名注入
[Inject(name="myNamedDependency")]
public var myNamedDependency:NamedDepedency; //命名注入

Robotlegs里三处提供了注入映射:MediatorMap、CommandMap、直接通过Injector。

mapValue 用来映射一个对象的特定实例到一个 injector. 当请求一个特定的类,使用类的这个特定实例来注入(已经存在的实例,不用rototlegs再次实例化)
//你的应用程序中某个映射/配置发生的地方
var myClassInstance:MyClass = new MyClass();
injector.mapValue(MyClass, myClassInstance);

mapClass 为每一个注入请求提供这个被映射的类的一个 特有( unique) 实例.
//你的应用程序中某个映射/配置发生的地方
injector.mapClass(MyClass);


mapSingleton 为每一个注入请求提供类的一个 单一_(_single) 实例.注意应用范围为robotlegs框架内。Context 之外并不强制它作为一个单例.

mapSingletonOf在功能上非常像 mapSingleton. 它对映射抽象类和接口很有用, 而 mapSingleton 用来映射具体类实现.
//你的应用程序中某个映射/配置发生的地方
injector.mapSingletonOf(IMyClass, MyClass); //MyClass implements IMyClass

MediatorMap:
将 mediators 映射到 view 并注册它们以便用来注入.
mapView(viewClassOrName:*, mediatorClass:Class, injectViewAs:Class = null, autoCreate:Boolean = true, autoRemove:Boolean = true):void
视图组件 中介meditor

CommandMap : command 映射到到触发它们的框架事件的方法.
mapEvent(eventType:String, commandClass:Class, eventClass:Class = null, oneshot:Boolean = false)
1命令类型 2执行命令的类(必须继承Command并重写execute方法) 3事件类 4,是否只触发一次

需要注意:
使用robotsleg管理实用实例后,如果在代码里new 一个对象,那个这个对象中一定不能包含注入对象,因为手动new 是不会通过robotslegs代理注入的。

 

  

 

 

posted @ 2012-12-14 18:36  itank  阅读(2375)  评论(0编辑  收藏  举报