网络相册开发(8)——Cairngorm架构浅析
Cairngorm是Adobe公司推荐的Flex架构。
关于它的文档少的可怜,我只发现了这两个:
Cairngorm中文文档:
http://download.csdn.net/download/tcx1986/513560
Developing Flex RIAs with Cairngorm microarchitecture
http://www.adobe.com/devnet/flex/articles/cairngorm_pt1.html
Cairngorm 架构包括六部分:Model Locator(共享数据),View(视图),Front Controller(前端控制器),Command (命令),Delegate(委托),Service(服务)。还有两个基础模块VO(数据对象),Event(事件)
Cairngorm流程大致如下:界面由View组成,View绑定Model Locater中的数据。客户在View中操作产生Event,Event被Front Controller所监听。Front Controller把Event绑定到Command,Command处理业务,创建Delegate,Delegate调用Service,Service远程访问Java。Java返回数据被Command得到并处理,更新Model Locater,View因为和Model Locater数据绑定,也会自动更新。详情见Cairngorm中文文档
这是我Flex代码的结构
VO
一般与服务器中domain里的对象一一映射。
需要注意的是转换时,数据类型的对应关系。
可参考转换表(http://download.csdn.net/download/ericder/677636)
BaseVO.as
Java代码
1.package net.sw.album.vo<br />2.{<br />3. import com.adobe.cairngorm.vo.IValueObject;<br />4.<br />5. public class BaseVO implements IValueObject<br />6. {<br />7. [Bindable]<br />8. public var id:Number;<br />9. [Bindable]<br />10. public var name:String;<br />11. [Bindable]<br />12. public var description:String;<br />13. [Bindable]<br />14. public var createtime:Date;<br />15.<br />16.<br />17. }<br />18.}
AlbumVO.as
Java代码
1.package net.sw.album.vo<br />2.{<br />3. [RemoteClass(alias="net.sw.album.domain.Album")]<br />4. public class AlbumVO extends BaseVO<br />5. {<br />6. [Bindable]<br />7. public var owner_id:Number;<br />8. [Bindable]<br />9. public var authority:int;<br />10. }<br />11.}
Model Locater
储存所有界面共享的数据,有点象session,不同的是保存在客户端
model locater采用的是单例模式
AlbumModelLocater.as
Java代码
1.package net.sw.album.model<br />2.{<br />3. import mx.collections.ArrayCollection;<br />4. [Bindable]<br />5. public class AlbumModelLocater<br />6. {<br />7.<br />8. private static var albumModelLocater:AlbumModelLocater;<br />9.<br />10. public static const MYALBUMSTATE:String="myAlbumState";<br />11.<br />12. public var ownerId:Number=1;<br />13. public var albumId:Number;<br />14. public var myAlbums:ArrayCollection;<br />15. public var myFriends:ArrayCollection;<br />16. public var picturesAC:ArrayCollection;<br />17. ...... .....<br />18.<br />19. public static function getInstance():AlbumModelLocater {<br />20. if(albumModelLocater == null) {<br />21. albumModelLocater = new AlbumModelLocater();<br />22. }<br />23. return albumModelLocater;<br />24. }<br />25.<br />26. }<br />27.}
Front Controller
负责接收Event,并把Event和Command联系起来
AlbumController.as
Java代码
1.package net.sw.album.controller<br />2.{<br />3. import com.adobe.cairngorm.control.FrontController;<br />4. import net.sw.album.command.*;<br />5. import net.sw.album.event.menuItemClickEvent.*;<br />6. import net.sw.album.event.*;<br />7.<br />8. import net.sw.album.model.AlbumModelLocater;<br />9.<br />10.<br />11. public class AlbumController extends FrontController<br />12. {<br />13. public function AlbumController()<br />14. {<br />15. initialiseCommands();<br />16. }<br />17.<br />18. public function initialiseCommands() : void<br />19. {<br />20. addCommand(DisplayMyAlbumEvent.EVENT_DISPLAY_MYALBUM,DisplayMyAlbumCommand);<br />21. addCommand(AddAlbumEvent.EVENT_ADD_ALBUM,AddAlbumCommand);<br />22. addCommand(ShowPhotoTileEvent.EVENT_SHOW_PHOTOTILE,ShowPhotoTileCommand);<br />23. ...... .......<br />24. }<br />25.<br />26. }<br />27.}
Delegate
都是结构化的东西,复制粘贴改几行代码就成了
AlbumDelegate.as
Java代码
1.package net.sw.album.business<br />2.{<br />3.<br />4. import com.adobe.cairngorm.business.ServiceLocator;<br />5.<br />6. import mx.rpc.IResponder;<br />7. import mx.rpc.remoting.RemoteObject;<br />8.<br />9. import net.sw.album.vo.AlbumVO;<br />10.<br />11. public class AlbumDelegate<br />12. {<br />13. private var responder : IResponder;<br />14. private var service : RemoteObject;<br />15.<br />16. public function AlbumDelegate(responder : IResponder )<br />17. {<br />18. this.service = ServiceLocator.getInstance().getRemoteObject( "albumService" );<br />19. this.responder = responder;<br />20. }<br />21.<br />22. public function findAlbumsByUserID() : void<br />23. {<br />24. var call : Object = service.getAll();<br />25. call.addResponder( responder );<br />26. }<br />27.<br />28. public function addAlbum(album:AlbumVO):void<br />29. {<br />30. var call : Object = service.saveAlbum(album);<br />31. call.addResponder( responder );<br />32. }<br />33.<br />34.<br />35. }<br />36.}
Service
定义远程过程调用,这里使用的是RemoteObject
Services.mxml
Xml代码
1.<?xml version="1.0" encoding="utf-8"?><br />2.<!--<br />3. @version $Revision: 1.1 $<br />4.--><br />5.<cairngorm:ServiceLocator<br />6. xmlns:mx="http://www.adobe.com/2006/mxml"<br />7. xmlns:cairngorm="http://www.adobe.com/2006/cairngorm"><br />8.<br />9. <mx:RemoteObject id="albumService" destination="AlbumManager"<br />10. showBusyCursor="true"><br />11. </mx:RemoteObject><br />12.<br />13. <mx:RemoteObject id="photoService" destination="PhotoManager"<br />14. showBusyCursor="true"><br />15. </mx:RemoteObject><br />16.<br />17.<br />18.</cairngorm:ServiceLocator>