网络相册开发(8)——Cairngorm架构浅析

2014-06-26
浏览
导读:Cairngorm是Adobe公司推荐的Flex架构。 关于它的文档少的可怜,我只发现了这两个: Cairngorm中文文档: http://download.csdn.net/download/tcx1986/513560 De

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>

Flash基础教程 动画基础知识

flash as3.0 跨域的解决办法

网络相册开发(8)——Cairngorm架构浅析

Flex中PureMVC学习小结

Flex与.NET互操作(十六):FluorineFx + F