Cairmgorm实例

一.Cairmgorm的组成结构:
1.Model Locator:在一个地方存储所有的值对象并共享变量,它与HTTP Session ,不过它是存储FLEX的客户端,而不是一个中间程序服务器的服务端。
2.Viex(视图):一个或多个FLEX组件绑定到一起形成一个特定的个体,使用Model Locator中的数据,并根据用户的交互动作产生自定义的Cairmgorm Event 事件。
3.Front Controller(前端控制器) :接受到Cairmgorm Event 并将其映射到到Cairmgorm command.
4.Command(命令):处理业务逻辑,调用Cairmgorm Delegate或者别的Command来更新数据。
5.Delegate(委托):有一个Command创建,它将远程调用(HTTP,WEB SERVICE等),并将结果返回给Command.
6.Service(服务):定义连接到远程数据库的远程过程调用。(HTTP,WEB SERVICE)
深化组成结构:
1.VO(ValueObject)
2.ModelLocator(数据模型)
3.View(界面视图)
4.Controller(控制部分FrontController Event)
5.Command(命令部分)
6.Business(业务逻辑部分) (Delegate-ServiceLocator)
二.基本思路:
三.类之间的关系:
以下是具体步骤:
1.新建一个FLEX工程并在编译路径中导入Cairgorm.swf
2.建立ModelLocator,它是全局性的,唯一的分享数据的存储。新建一个model文件夹在下面建立一个文件为:

package model
{
import mx.collections.ArrayCollection;

[Bindable]
public class ModelLocator
{
public var photoData:ArrayCollection=new ArrayCollection();
public var purchasedPhotos:ArrayCollection=new ArrayCollection();
static private var __instance:ModelLocator=null;

static public function getInstance():ModelLocator
{
if(__instance == null)
{
__instance=new ModelLocator();
}
return __instance;
}
}
}

3.建立ServiceLocator,它可以使用多种的远程调用。

//定义了服务类型
<?xml version="1.0" encoding="utf-8"?>
<rds:ServiceLocator xmlns:rds="com.adobe.cairngorm.business.*"
xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:HTTPService id="photosIn" url="assets/photos.xml"/>
</rds:ServiceLocator>

4.新建Cairgorm events,此事件是包括了客户时间和业务事件的。新建一个business文件夹并在下面建立一个events文件夹,新建两个文件:

package business.events
{
import com.adobe.cairngorm.control.CairngormEvent;
import valueObjects.Photo;

public class AddPhotoToCartEvent extends CairngormEvent
{
static public var EVENT_ID:String="addPhotoToCart";
public var photo:Photo=null;

public function AddPhotoToCartEvent(photo:Photo)
{
super(EVENT_ID);
this.photo=photo;
}
}
}


package business.events
{
import com.adobe.cairngorm.control.CairngormEvent;

public class LoadPhotosEvent extends CairngormEvent
{
static public var EVENT_ID:String="loadPhotos";

public function LoadPhotosEvent()
{
super(EVENT_ID);
}
}
}

5.实例化Command,控制层的Command是主管了业务逻辑和响应业务事件的。它的特点有:每一个类都对应一个业务逻辑,由它来更新数据,所有的进入和实例化方法为excute(),
在business下新建commands文件夹,包含两文件:

package business.commands
{
import business.events.AddPhotoToCartEvent;

import com.adobe.cairngorm.commands.ICommand;
import com.adobe.cairngorm.control.CairngormEvent;

import model.ModelLocator;

import valueObjects.Photo;

public class AddPhotoToCartCommand implements ICommand
{
private var __model:ModelLocator=ModelLocator.getInstance();

public function execute(event:CairngormEvent):void
{
var photo:Photo=(event as AddPhotoToCartEvent).photo;
__model.purchasedPhotos.addItem(photo);
}
}
}


package business.commands
{

import business.delegates.PhotoDelegate;

import com.adobe.cairngorm.commands.ICommand;
import com.adobe.cairngorm.control.CairngormEvent;

import model.ModelLocator;

import mx.collections.ArrayCollection;
import mx.rpc.Responder;
import mx.rpc.events.ResultEvent;

import valueObjects.Photo;

public class LoadPhotosCommand implements ICommand
{
private var __model:ModelLocator=ModelLocator.getInstance();


public function execute(event:CairngormEvent):void
{
/*
var service:HTTPService=__locator.getHTTPService("photosIn");
service.addEventListener(ResultEvent.RESULT,onResults_loadPhotos);
service.send();
*/
var responder:Responder = new Responder(onResults_loadPhotos, null);
var delegate:PhotoDelegate = new PhotoDelegate(responder);
delegate.loadPhotos();
}
private function onResults_loadPhotos(event:ResultEvent):void
{
var photoRaw:ArrayCollection=event.result.photos.image;
for(var i:int=0;i<photoRaw.length;i++)
{
var tempPhoto:Photo=new Photo();
var photoFromAC:Object=photoRaw.getItemAt(i);
tempPhoto.filename=photoFromAC.filename;
tempPhoto.photographer=photoFromAC.photographer;
tempPhoto.desc=photoFromAC.desc;
tempPhoto.category=photoFromAC.category;
__model.photoData.addItem(tempPhoto);
}
}
}
}

6.实例化FontContoller,它负责拦截业务事件并将其交到对应的command中,他是事件的路由器。在business中建立文件:

package business
{
import business.commands.AddPhotoToCartCommand;
import business.commands.LoadPhotosCommand;
import business.events.AddPhotoToCartEvent;
import business.events.LoadPhotosEvent;

import com.adobe.cairngorm.control.FrontController;

public class FSController extends FrontController
{
public function FSController()
{
super();
//将相应的事件注册到Command中去
addCommand(LoadPhotosEvent.EVENT_ID,LoadPhotosCommand);
addCommand(AddPhotoToCartEvent.EVENT_ID,AddPhotoToCartCommand);
}
}
}

7.实例化Delegates:它的特点是:提供一个本地代理为远程服务,服务作为作为一个连接客户和开发服务团队,实例化的细节包括:查找服务,调用远程接口,传输参数,格式化数据。新建一个delegate文件夹,文件为:

package business.delegates
{
import com.adobe.cairngorm.business.ServiceLocator;

import mx.rpc.AsyncToken;
import mx.rpc.IResponder;
import mx.rpc.http.HTTPService;
public class PhotoDelegate
{
private var __locator:ServiceLocator=ServiceLocator.getInstance();
private var __service:HTTPService;
private var __responder:IResponder;
public function PhotoDelegate(responder:IResponder)
{
__service = __locator.getHTTPService("photosIn");
__responder = responder;
}
public function loadPhotos():void
{
var token:AsyncToken = __service.send();
token.addResponder(__responder);
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值