加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flex RIA程序开发框架 ——————Cairngorm

发布时间:2020-12-15 03:39:06 所属栏目:百科 来源:网络整理
导读:Cairngorm 是由 adobe 公司推出的一个轻量级的 Flex RIA 程序开发框架。中文名: “ 烟水晶 ” 。目的是提高程序的可扩展性、可维护性,其本身并不是一个完整的企业应用,它只是提供了一个开发骨架, Adobe 称之为体系。 Cairngorm 主要就是对开发 Flex 应用

 Cairngorm是由adobe公司推出的一个轻量级的Flex RIA程序开发框架。中文名:烟水晶。目的是提高程序的可扩展性、可维护性,其本身并不是一个完整的企业应用,它只是提供了一个开发骨架,Adobe称之为体系。 Cairngorm主要就是对开发Flex应用程序应用了一系列的设计模式,从而使开发出来Flex程序可扩展性,可维护性都大大提高。轻量级的mvc.

 一:Cairngorm就是一大堆的设计模式和功能模块,它分为7部分,前六个是核心骨架,分别是

1.???Business(业务逻辑部分)定义RPC

2.???Command(命令部分)调用CairngormDelegate或其它Command ,并更新Model

3.???Control(控制部分)侦听Cairngorm事件并将其映射到Cairngorm Command

4.???Model(数据模型部分)使用singleton(单例)模式共享变量;

5.???View(界面部分)Model的数据绑定互组件并广播侦听Cairngorm Event

6.???Value Object(数据部分)。一般简称VO 储存特定值对象变量。

7.???Delegate(委托):实例化RPC(远程过程调用)并将其结果返回给Command


二 :了解了这6大部分之后,我们再来说一说Cairngorm的流程:

1.???View部分提供所有可视组件,FrontControl监听所有的Event。

2.???当用户操作引起Event发送时,View通过CairngormEventDispatcher发送Event,之后Event在FrontControl接受处理。

3.???FrontControl将Event发送到相应的Command,Command调用相应Delegate。

4.???Delegate完成远程调用,返回到Command。

5.???Command结果处理部分处理返回的信息,并且对Model部分进行修改。

6.???Model部分的绑定数据被修改,View部分做出相应变化。?

三:在这里我们将对Cairngorm框架中的各个部分进行一个简单的介绍

1:Business

包括两部分内容:Delegate和ServiceLocator。

  ServiceLocator是一段用于描述远程服务的mxml文件,实际上如果不需要调用远程服务的时候我们可以不必写这样一个mxml文件,但是那样的话Cairngorm就失去了它强大的优势。

  Delegate相当于一个代理,通过Command调用,它的工作是定位远程服务并且完成相应的服务调用,ServiceLocator就是这个远程服务的定义。Delegate是一个单例模式(singleton pattern),我们一般用如下的方式通过Delegate调用远程服务:

1

private var remoteObject:RemoteObject = ServiceLocator.getInstance().getRemoteObject("countingService");

  其中 “countingService”在ServiceLocator中通过如下方式定义:

1

2

3

4

5

6

7

8

9

<?xml version="1.0"?encoding="utf-8"?>

<cairngorm:ServiceLocator xmlns:fx="http://ns.adobe.com/mxml/2009"

?????????xmlns:s="library://ns.adobe.com/flex/spark"

?????????xmlns:mx="library://ns.adobe.com/flex/mx"

?????????xmlns:cairngorm="com.adobe.cairngorm.business.*">

????<fx:Declarations>

????????<s:RemoteObject id="counting"?destination="countingService"/>

????</fx:Declarations>???

</cairngorm:ServiceLocator>

  当然,我们也可以通过HttpService和WebService调用远程服务,如此的话,在Delegate中的调用方法也会有变化。Cairngorm提供了getRemoteObject(),getHttpService(),getWebService()三种基本方法分别调用RemoteObject,HttpService和WebService三种远程调用机制。

  每一个自定义的Delegate要具有如下的构造函数:

1

2

3

4

public function CountDelegate(responder:IResponder)

{

????this.responder = responder;

}

为什么这样写,我们在Command部分解释。

 2:Command

  Command部分包含所有可执行的命令,你可以理解为所有的后台函数调用都在Command部分完成,至于Command如何完成这些任务我们稍后再说。Command部分定义了ICommand接口,并且需要实现一个叫做execute()的方法。我们可已通过定义自己的Command来完成我们需要的任务,所有的Command命令都要实现ICommand和IResponder接口,IResponder接口定义了result()和fault()方法,所以我们自定义的Command应当是如下效果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

package command

{

????import com.adobe.cairngorm.commands.ICommand;

????import com.adobe.cairngorm.control.CairngormEvent;

????import mx.rpc.IResponder;

????import mx.rpc.events.ResultEvent;

????public class CountCommand implements ICommand,IResponder

????{??????

????????public function CountCommand()

????????????????{??????

????????}??????

????????public function execute(event:CairngormEvent):void

????????{

????????}??

????????public function result(data:Object):void

????????{

????????}??

????????public function fault(info:Object):void

????????{

????????}

????}

}

  其中execute()函数声明一个Delegate变量,然后通过这个Delegate调用相应的方法。Command任务的实现实际上是通过Delegate完成的,Command并不负责定位远程的服务。另外,Command的另外两个方法——result()和fault()一般用来处理Delegate的返回信息,其中result()是在处理成功时执行,一般是对Model进行一些处理(Model部分有一个单例模式的ModelLocator),fault是在处理失败时候执行。还记得上面我们提到的Delegate必须有一个带有IResponder类型的构造函数吗?现在我们可以解释了。

  试想,我们用Command调用Delegate来执行远程服务,当Delegate执行完毕之后(或者说调用完毕之后)应当如何返回呢?Delegate应当如何定位是

哪一个Command传来的执行信号呢?通过给Delegate传递一个IResponder变量(实际上这个变量就是Command自己)Delegate就可以在处理完毕之后直

接调用Command中的result方法。一般Delegate中有这么一句话:

1

responder.result(objec);

object一般是要返回的值或者服务相关信息。

 3:Control

  Control部分

?Control中有3个基类:CairngormEvent,CairngormEventDispatcher和FrontController

?CairngormEvent继承与flash.event.Event, 他包含一个data成员,用来传递参数数据之用。

?CairngormEventDispatcher是一个单例类(singleton),用来广播用户发起的动作类事件 (CairngormEvent),主要的调用方法是

CairngormEventDispatcher.getInstance().dispatchEvent().

?FrontControllers可以说是控制中心。在这里你要做的工作是将事件(CairngormEvent)和命令(Command)之间的映射关系注册在它的成员中( 该

成员类型是Dictionary),通过下面的类似方法进行注册。addCommand(OrderRequestEvent.EVENT_GETUSERORDERREQUESTS,GetUserOrderRequests);

如此一来,凡是CairgormEventDispatcher广播出来的事件都会在这里进行查找,找到某个event对应的command,然后会执行command的execute()方法。

  CairngormEvent定义一个Event,一般在CairngormEvent中存储数据模型,例如我们要做一个用户登录页面,点击登录按钮之后我们就发送一个包含用户名和登录密码的event,我们可以把用户名和登录密码封装在一个类中(这就是后面我们要说的VO)然后放入event里面。

  CairngormEventDispatcher是一个单例模式,它的作用就是发送消息,一般用如下方法调用:

1

CairngormEventDispatcher.getInstance().dispatchEvent(CairngormEvent);

FrontController相当于一个控制中心,我们所发送的所有消息和执行的所有命令都在这里有记录。FrontController的构造函数一般只有一句话:

1

2

3

4

public function MyFrontControl()

{

????this.addCommand(EVENT_NAME,Command);

}

FrontController一个重要的任务就是它监听所有的Event,并且为这些消息指定相应的Command。在此提醒一下,我们需要在界面中声明FrontController,举例如下:

1

2

3

4

5

<s:Application xmlns:control="control.*">

????????<fx:Declarations>

????????????<control:MyFrontControl/>

????????</fx:Declarations>

</s:Application>

MyFrontControl是位于control包中的一个自定义FrontController。

4:Model

在Model中定义了接口ModelLocator,我们只需要实现该接口,并把所有需要办绑定的数据放在这里就可以了。一般我们都采用单例模式

(Singleton)来实现,而且根据项目模块进行分类,而不是一股脑儿的把所有数据都扔到这里了事。可以说ModelLocator是系统的数据中心。

  Model部分一般存放需要绑定在页面的数据。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

package model

{

????import com.adobe.cairngorm.model.ModelLocator;

????????import vo.VO;??

?

????[Bindable]

????public class MyModelLocator implements ModelLocator

????{

????????public var vo:VO;

????????private static?var modelLocator:MyModelLocator;

?????????

????????public static?function getInstance():MyModelLocator{

????????????if(modelLocator==null){

????????????????modelLocator=new MyModelLocator();

????????????}

????????????return modelLocator;

????????}

????}

}

5:View

再来看看View中都有什么。View中有ViewHelper和ViewLocator。

?ViewLocator是一个单例类,用于统一管理和获取ViewHelper。类似于ServiceLocator,和FrontController,在这里可以注册多个ViewHelper,并通过关键字直接找到需要的ViewHelper实例。

?ViewHelper是具体用来操作某个视图的类,它是通过其成员变量view来引用到具体的视图,当它被实例化的时候就会在ViewLocator中注册一个ViewHelper

?如:

?将实例化一个ViewHelper,并在ViewLocator中注册一个名为listViewHelper的ViewHelper实例,通过该id可以得到其实例的引用,如:

varlistViewHelper:ViewHelper = (ViewHelper)ViewLocator.getInstance().getViewHelper("listViewHelper")


6:VO 部分

最后提一下vo,其实IValueObject和ValueObject没有任何实际作用,唯一的就是提高vo类的可读性,表示该类是一个ValueObject,可能是为将来设计用的。我们不需要实现任何接口函数。 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读