正如在使用Cairngorm时,视图中的每一个动作都播送一个事件,每个播送出去的事件都需要建立相应的命令代码来处理事件。并且需要在FrontController中对应他们的关系。例如下面的简单流程:
Loginvew.xml —> action login() —>dispatch LoginEvent —>Handled by LoginCommand —>mapping LoginEvent and LoginCommand in FrontController.
在不考虑商务层代码的情况下,当用户建立然后新的动作时,就需要建立2个新的代码,修改Controller代码。
那么如何简化Cairngorm,我的方法是去掉FrontController,取而代之的是Service Façade,其框架图如下所示:
在上图中,视图不再播送如何事件,而是直接调用Service Façade。而Service Façade则直接调用商务委托层与服务器端通讯(如Remote Object等),然后商务委托处理结果并更新Model Locator,最后Model Locator通过绑定(Binding)更新视窗中的结果。
看一下被改变的代码:
ServiceFacade.as:
package com.ny.flex.cairngorm.no_fc.service
{
import com.ny.flex.cairngorm.no_fc.vo.User;
public class ServiceFacade
{
private static var _serviceFacade:ServiceFacade = null;
public function ServiceFacade(privateClass:PrivateClass)
{
if(ServiceFacade._serviceFacade == null){
ServiceFacade._serviceFacade = this;
}
}
public static function getInstance():ServiceFacade {
if(_serviceFacade == null){
_serviceFacade = new ServiceFacade(new PrivateClass);
}
return _serviceFacade;
}
public function authenticate(user:User):void{
LoginDelegate.getInstance().authenticate(user);
}
public function getBuddyList():void{
BuddyListDelegate.getInstance().getBuddyList();
}
}
}
class PrivateClass{}
ServiceFacade提供了对所有商务逻辑为一体的界面,视窗的行为(Action)仅仅调用façade,例如下面代码中的Login的动作。
Loginvew.xml :
private function login():void{
if(Validator.validateAll(validators).length == 0){
var loginUser:User = new User();
loginUser.userName=username.text;
loginUser.password=password.text;
serviceFacade.authenticate(loginUser);
}
}
函数 serviceFacade.authenticate(loginUser)如下:
public function authenticate(user:User):void{
LoginDelegate.getInstance().authenticate(user);
}
ServiceFacade使用LoginDelegate 来真正实现Business Logic:
LoginDelegate.as:
package com.ny.flex.cairngorm.no_fc.service
{
import com.ny.flex.cairngorm.no_fc.*;
import com.ny.flex.cairngorm.no_fc.vo.User;
import mx.rpc.IResponder;
import mx.rpc.Responder;
import mx.rpc.events.ResultEvent;
public class LoginDelegate extends BaseDelegate
{
private static var _loginDelegate:LoginDelegate = null;
public function LoginDelegate(privateClass:PrivateClass){
if(LoginDelegate._loginDelegate == null ){
LoginDelegate._loginDelegate = this;
}
}
public static function getInstance():LoginDelegate{
if(_loginDelegate == null){
_loginDelegate = new LoginDelegate(new PrivateClass);
}
return _loginDelegate;
}
public function authenticate(user:User):void{
var responder:IResponder = new Responder(onResult_Authenticate,fault);
var call:Object = service.authenticate(user);
call.addResponder(responder);
}
private function onResult_Authenticate(event:ResultEvent):void{
var authUser:User = event.result as User;
model.loginUser = authUser;
model.viewStackSelectedIndex = 1;
}
}
}
class PrivateClass{}
上面的authenticate(user) 实现于后台通讯并处理结果,更新Model Locator。
其他的视图和相应的处理方法 与上面类似。
这个解决方案简化了Cairngorm的框架,使得代码更易于理解。而且,彻底摆脱了 无味的dispatcher,frontcontroller 和command。 编码效率会提高 并且易于调试。
但其弱点是显而易见的:它违犯了解耦的(就是使得设计程序耦合性尽可能的降低)设计规范,使得界面上的行为(Action)和Serivce Façade产生了耦合关系。
在最后一篇中我将讨论下一个Flex 开发的热点:Mate-标签化的框架。
分享到:
相关推荐
flex开发系列书籍:Cairngorm_MVC_框架
Flex开发框架cairngorm入门实例教程,有需要的人可以看一下
Flex框架Cairngorm经典案例源码 完全掌握Cairngorm
Flex login flex cairngorm
本文介绍了Cairngorm框架的核心组件,工作流程。并分析了Cairngorm框架的优点和不足
本文对Flex轻量级开发框架Cairngorm进行了详细的描述,相信对急于想学些本框架的开发人员来讲有很大用处。
Flex UI Design For Cairngorm
Cairngorm框架在Flex开发中的应用研究
flex+cairngorm+java 实例
flex框架之Cairngorm框架,包括Cairngorm框架
3.0语法、Flex组件开发、CSS布局、美化界面、数据传输与交互、AIR平台应用和开发框架Cairngorm等。为了便于读者学习,本书最后两章分别对两个较综合的实例进行分析。详细讲解了Cairngorm开发框架的搭建、组件设计、...
當adobe公司推出Flex2和Action Script3的時候,把Itereation:Tow並入成為合作伙伴,Cairngorm也成為adobe官方欽定的開發框架,並同時發佈Cairngorm for Flex 2版本。 Cairngorm本身並不是一個完整的企業應用,它只...
一个 Flex+J2EE实例(cairngorm+blazeDS+hibernate+spring) 本实例为一个 flex 与 java通信项目。前端采用cairngorm框架,后台 采用hibernate+spring 每个部署 步骤,附详细 图文解释。旨在 采用 一种快速开发 ...
cairngorm.swc供需要的朋友急用
Flex Cairngorm Parsley 最新的源码DEMO!
Spring Actionscript IOC Flex Cairngorm MVC
flex框架之Cairngorm框架,一个用Cairngorm与后台通信实例
flex MVC框架搭建步骤 Cairngorm
前台FLex工程(单独工程Cairngorm)使用Cairngorm框架与后台java工程(FLexToJava)进行数据交互。功能点: ①flex提交表单保存到数据库; ②flex向后台请求,后台返回List集合,flex将集合填充到combox 附带:...
一个 flex 的 cairngorm 框架开发实例...内有清晰的注释,相信对你学习flex技术有一定的帮助~~