【VC++开源代码栏目提醒】:网学会员在VC++开源代码频道为大家收集整理了“PureMVC+Cairngorm+—对Flex开源框架的优化组合 - 电子设计“提供大家参考,希望对大家有所帮助!
计 算 机 系 统 应 用 2009 年 第 12 期 184 实践经验 Practical Experience PureMVCCairngorm—对Flex
开源框架的优化组合① PureMVCCairngorm—Optimal Combination of Flex Open Source Framework 张 辉 盐城师范学院 信息科学与技术学院 江苏 盐城 224002 摘 要 随着RIA的兴起Flex技术得到了广泛的应用将Web客户层的设计从以页面为中心提升到以组件为中心。
为了满足复杂多变的系统需求对目前主流的Flex官方
开源框架进行分析用PureMVC的分层解耦思想来简化Cairngorm的事件机制并改进了Cairngorm的Web service、服务调用的封装和业务逻辑新的体系仍以原来的MVC主体思想为基础但相比之下灵活性更好适合性更强。
关键词 富互联网应用
开源框架 服务 事件机制 客户端 RIARich Internet Applications技术结合了桌面应用和互联网应用的优点既能提供良好的用户体验又不需要在用户计算机上进行部署是下一代的将桌面应用程序的交互的用户体验与传统的Web应用的部署灵活性和成本分析结合起来的
网络应用程序。
Adobe Flex及相关技术正成为RIA领域的主流 可以展现Flash的炫目的客户端效果和全新的用户体验。
目前较成熟的
开源框架有Cairngorm、PureMVC、Model-Glue: Flex、Foundry、Guasax Flex Framework、ARP、Flest Framework除了用来开发RIA用户界面的框架RIA开发者还有其他辅助工具1。
但现有的架构并非十全十美在具体开发中经常需要根据实际情况进行优化与重构。
通过分析Flex两个成熟的
开源框架Cairngorm和PureMVC提出PureMVCCairngorm优化组合框架可用于中小型RIA项目进一步扩展也可用于企业级开发。
1 Flex与客户端数据存储 1.1 Flex技术 Flex语言是与
Java类似的面向对象语言吸收了
Delphi的编码风格。
其应用程序设计使用扩展的 ① 收稿时间:2009-03-15 UI组件库与基于XML的MXML来定义丰富的用户界面利用面向对象的脚本语言ActionScript3.0 来处理程序逻辑由Flex服务器翻译成SWF 格式的客户端应用程序在Flash Player中运行结合了声音、视频和实时对话的综合通信技术使RIA 具有高度互动性和丰富的网上用户体验。
可以运行于J2EE 和.
NET 平台还可以与一些现有的表示技术与框架结构如
JSPStruts等进行集成。
1.2 客户端本地存储数据 浏览器通常将某些特殊数据存储在本地cookie中 但cookie 对单个域名仅仅可以存储不超过4kB的数据。
现在有Macromedia Flash、IE 的User Data 和Firefox 的DOM Storage三种技术允许在本地存放超过4kB容量限制。
FlashPlayer可以在无需用户干预下保存单个域名下100kB的数据在客户进入Flash 设置管理器中允许设置本地存储容量100kB、1MB、10MB 至无限制2。
2 Caringorm和PureMVC Cairngorm是Adobe官方最早的flex开发框架适合大型的Flex应用PureMVC是针对AIR的开发提出但是对于开发Flex仍然适用其结构明晰、 2009 年 第 12 期 计 算 机 系 统 应 用 Practical Experience 实践经验 185 加简单实用是Flex世界中的MVC模式的具体实现。
2.1 Cairngorm架构 Cairngorm本身并不是一个完整的企业应用它只是提供了一个开发的骨架Adobe称之为体系。
对开发Flex应用程序应用了单例、工厂、命令、代理及桥接等一系列的设计模式从而使开发出来Flex程序可扩展性可维护性都大大提高。
其客户端请求应答方式如图1所示 图1 Cairnform客户端请求应答方式图 Cairngorm的优点 · 分离状态处理、表现、动作与服务端
通信
代码简单清晰 · 程序迭代时能够拥抱变化 · 保持表现层和数据模型尽可能的简单 · 开发简单测试独立 · 有利于平行开发。
Cairngorm缺点 · 结构复杂不容易理解 ·
代码量增多带来维护困难 · 开发效率低。
2.2 PureMVC架构 从使用者角度上讲PureMVC设计的非常合理具体过程和MVC解耦方法类似都是通过观察者模式命令模式把程序分为低耦合的三层Model、View和Controller合称为PureMVC框架的核心。
对外的接口是Facade由Facade来组织整个应用。
其中Controller、Model、View是管理ICommand、IProxy、IMediator的容器而ICommandIProxyIMediator是应用系统要扩展的MVC各层的接口。
PureMVC的优点 · 结合了MVC和MVP框架的优点实现很彻底 · 结构清晰各部分耦合度很低灵活度非常高 · 各部分单元测试容易实施 · View重用容易实现 · 可用于组件、Module开发 · Proxy的
设计使得扩展和维护比较容易。
图2 PureMVC架构类图 PureMVC的缺点 · 灵活度过高很难清晰地控制一个事务过程 ·
代码冗余量高Mediator、Proxy等继承类的冗余
代码比较多。
3 PureMVCCairngorm优化组合的实现 在开发Flex RIA时通常会面临维护维护端的数据状态、设计视图的架构、实现受驱动的事务、调用服务器端服务等几个首要问题。
由于每个应用程序采用的框架不同因此不可能提供一个适合于所有
软件的分层体系结构。
但是任何框架下的分层体系基本包括以下特征: 1 每个层由一组相关的类或组件如Flex组件构成共同完成特定的功能 2 层与层之间存在自上而下的依赖关系即上层组件会访问下层组件的API而下层组件不应该依赖上层组件 3 每个层对上层公开API但具体的实现细节对外透明。
在开发过程中恰当地给应用程序分层能极大地提高应用
程序的伸缩性、可维护性、可扩展性、可重用性、可管理性等性能。
计 算 机 系 统 应 用 2009 年 第 12 期 186 实践经验 Practical Experience3.1 事件机制的简化 Caimgorm框架下开发的应用程序启动时FrontController同时也在初始化它的主要
工作是为所有需要Command类处理的事件
注册监听器。
在应用程序启动时就同时启动所有的监听器监听事件实际上是等于触发了许多的监听线程这些监听线程在整个应用程序的生命周期里都会一直存在消耗了大量的系统资源。
PureMVC基本上解决了Cairngorm存在的这一
问题。
因此设计一个基于PureMVC分层思想的FacadeController来取代FrontController视图不再播送如何事件而是直接调用FaadeController而Fa
cadeController则直接调用商务委托层与服务器端通讯然后商务委托处理结果并更新Model Locator最后Model Locator通过绑定更新视窗中的结果。
其框架图如图3所示 图3 FacadeController框架流程图 这个
方案简化了Cairngorm框架彻底摆脱了dispatcher、frontcontroller和command使得
代码更易于理解、编码效率提高并且易于调试。
3.2 强化Webservice Manager 在Caingorm中webservice部分直接使用了mx.rpc.soap.WebService来提供连接但这个类的事件处理并不完善应用程序很多时候不仅需要处理返回的正常结果和异常结果也需要知道何时连接Webservice何时开始传输数据3而这一点 Caim- gorm框架是无法做到的。
如果用URLLoade来完成Webservice连接开发人员可以使用progessEvent. PROGRESSEvent.OPEN等事件。
public class WebServiceManager //定义Web服务管理类 private static var instance: WebServiceManager …… //定义私有类 Public function addService name: String wsdl:stringtarget:Responder:void //定义添加服务函数 var loader:URLLoadernewURLLoader …… //加载新网址 由于实现了Responder接口便把自己作为Responder类型传给了
webserviceMananger于是ClickEvent就可以用onComplete、onstart、onProgress和onFault来处理各个状态的事件。
这给开发人员提供了更多的选择让开发人员有更大的自由来操作服务的不同状态。
3.3 业务逻辑的分离—降低耦合 用Cairngorm框架开发了某个应用程序之后业务逻辑包括事件处理和调用服务的返回结果的处理都被封装在了Cairngorm框架下定义的类中无法解决
代码重用的问题不仅浪费了大量时间和精力也使
代码变得臃肿。
应该把它们从Cairngorm框架中抽取出来把业务逻辑从事件类中分离到一些相对独立的类中这样使集成测试更具扩展性。
EventHandler类是一个在框架定义之外的类所以从良好的封装调用思想出发业务逻辑最好应当独立于框架之外由一个或几个像EventHandle:这样的对象专门负责实现事件类的事件执行和处理。
Public class EventHandler //定义事件处理类 Private static var instance:EventHandler//变量定义 Public static function getInstance: EventHandler If instancenull //判断变量 Instancenew EventHandler //变量赋新值 Return instance //函数返回值 2009 年 第 12 期 计 算 机 系 统 应 用 Practical Experience 实践经验 187 因为EveniHandle类的相对独立性应用程序完全可以轻易的实现
代码重用变动代价便会减小可维护性因而大大提高。
3.4 服务调用的进一步抽象 之所以需要用代理控制对远程对象的访问一是应用程序自身是不知道如何和远程对象沟通的在
代码中写入一长串调用服务中方法的语句使得的藕合度高不适合封装调用的思想二是某一个服务可能在不同的地方被多次调用这些服务返回的结果可能会有不同的用途三是在一般情况下应用程序的开发会分成服务器端的开发和Flex客户端的开发两组。
业务代理实际上就成了两组之间同遵守的一个协约因为它充当了客户端和服务器端之间的一个接口规定了Flex前端需要调用的接口和服务器后台需要实现的接口4。
引入Delegator代理类它进一步封装了服务调用使开发人员感觉完全像直接调用后台的方法一样这样业务逻辑和服务调用便彻底的分离开。
public class ProductDelegator //定义业务代理类 public function ProductDelegate responder:Responder //定义业务代理函数 this.serviceHTTPServiceGrocerServiceLocator.getInstance.getService“prodByCatRPC” //获取代理服务 this.responderresponder //赋值响应参数 var manager:ServiceManagerService Manager.getInstance …… //处理过程 这个Delegator类将调用服务的
代码从事件类中分离出来而事件类现在可以调用这个Delegator来获取服务。
public function execute:void //定义事件分离函数 var delegate:ProductDelegatenew Product Delegatethis delegate.getProducts //调用事件处理函数 4 在实际项目的应用 某天气预报
查询系统可以远程调用一个公用的Web Services网站的数据提供全国各个地区天气预报的数据并在数据格栅和图表中将数据显示出来。
4.1
系统流程与
代码结构 基于以上设计的PureMVCCairngorm思想设计系统流程图与
代码结构如图4和图5 图4 系统流程图 图5
代码结构图 值对象部分ValueObject用来存储项目所使用的数据类型。
视图部分View由一个或多个Flex组件组成的用户界面构成用于显示数据、表达内容并与用户形成交互。
控制器FacadeController对应事件和命令
代码直接调用商务委托层与服务器端通讯。
模型定位器Model Locator用于存储程序中所有的值对象并且共享变量它存储在客户端。
计 算 机 系 统 应 用 2009 年 第 12 期 188 实践经验 Practical Experience服务Service定义与后端服务器生成联系得到数据。
商务层Business定义所要使用的Web Serv- ices的有关数据。
4.2 控制层实现 通过唯一的类来担负前端事件传入与幕后事件的执行开发人员可以更加关注事务逻辑的处理。
事件机制流程如图6 图6 新的事件机制流程 GetWeatherBycityControl.as实现
代码如下 public class GetWeatherBycityControl //定义控制类 private static var GetWeatherBycityControl: //变量定义 GetWeatherBycityControl null //初始值 Public function GetWeatherBycityControl privateClass:PrivateClass //定义控制函数 ifGetWeatherBycityControl._ GetWeatherBycityControl null //判断变量值 …… //自定义处理过程 5 总结 新的框架一方面降低了原框架的复杂度另一方面增强了易用性使得Flex应用程序的开发效率可以大大提高
代码的可维护性也得到增强。
在实际项目系统开发中的应用表明其具有松耦合、高效率的特点并且有较好的性能为设计更具弹性与应变能力的健全的RIA系统架构提供参考。
参考文献 1 Zhang MX. Open Source Flex Development Frame- works Show that Platform is Gainimg Momentum. 2008-1-20http://www.51cto.com/art/200801/64671.htm 2 潘大四.基于FLEX技术构建可离线Web 应用程序的研究与实现.
计算机科学2008357:298299. 3 Guilizzoni G Lesser B Lott J Reinhardt R Watkins J. Programming Flash Communication Server.O’Reilly Media2005.3.1. 4 Kazoun C Lott J. Porgramming Flex 2:The compre- hensive guide to creating rich media.O’Reilly Media 2007.4.1. 5 Yard T Elst P Jacobs S. Object-Oriented Action Script3.0Friends of Ed2007.6.23. 6 Adobe Consultant team.Developing Flex RIAs with Cairngorm.Microarchitecture.2008-1-8http://www.adobe.com