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

Flex Cairngorm详解

发布时间:2020-12-15 04:24:01 所属栏目:百科 来源:网络整理
导读:Cairngorm是一个开源的Flex项目,为FLex提供了一个类似MVC的体系结构框架,它是Flex?RIA开发的最好框架之一。使用Cairngorm框架可以大大提高开发和维护的效率。 Cairngorm说白了就是一大堆的设计模式和功能模块,它分为6部分,分别是: Business(业务逻辑部

Cairngorm是一个开源的Flex项目,为FLex提供了一个类似MVC的体系结构框架,它是Flex?RIA开发的最好框架之一。使用Cairngorm框架可以大大提高开发和维护的效率。

  Cairngorm说白了就是一大堆的设计模式和功能模块,它分为6部分,分别是:

  1. Business(业务逻辑部分)。

  2. Command(命令部分)。

  3. Control(控制部分)。

  4. Model(数据模型部分)。

  5. View(界面部分)。

  6. Value?Object(数据部分)。一般简称VO  

 先来了解一下这6部分的组成和功能:

 Business

 Business包括两部分内容:Delegate和ServiceLocator。
 ServiceLocator是一段用于描述远程服务的mxml文件,实际上如果不需要调用远程服务的时候我们可以不必写这样一个mxml文件,但是那样的话Cairngorm就失去了它强大的优势。
 Delegate相当于一个代理,通过Command调用,它的工作是定位远程服务并且完成相应的服务调用,ServiceLocator就是这个远程服务的定义。Delegate是一个单例模式(singleton?pattern),我们一般用如下的方式通过Delegate调用远程服务:?
?
private?var?remoteObject:RemoteObject?=?ServiceLocator.getInstance().getRemoteObject("countingService");
?
其中?“countingService”在ServiceLocator中通过如下方式定义:?
?
<?xml?version="1.0"encoding="utf-8"?>?
<cairngorm:ServiceLocator?xmlns:fx=" http://ns.adobe.com/mxml/2009"?
?????????xmlns:s=""?
?????????xmlns: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要具有如下的构造函数:?

?
public?function?CountDelegate(responder:IResponder)?
{?
????this.responder?=?responder;?
}

?

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

?

 Command

 Command部分包含所有可执行的命令,你可以理解为所有的后台函数调用都在Command部分完成,至于Command如何完成这些任务我们稍后再说。Command部分定义了ICommand接口,并且需要实现一个叫做execute()的方法。我们可已通过定义自己的Command来完成我们需要的任务,所有的Command命令都要实现ICommand和IResponder接口,IResponder接口定义了result()和fault()方法,所以我们自定义的Command应当是如下效果:?
?
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中有这么一句话:
?
responder.result(objec);
?
object一般是要返回的值或者服务相关信息。

 Control

 COntrol部分定义了三个基类:CairngormEvent,?CairngormEventDispatcher,?FrontController。
 CairngormEvent定义一个Event,一般在CairngormEvent中存储数据模型,例如我们要做一个用户登录页面,点击登录按钮之后我们就发送一个包含用户名和登录密码的event,我们可以把用户名和登录密码封装在一个类中(这就是后面我们要说的VO)然后放入event里面。
 CairngormEventDispatcher是一个单例模式,它的作用就是发送消息,一般用如下方法调用:
?
CairngormEventDispatcher.getInstance().dispatchEvent(CairngormEvent);
?
FrontController相当于一个控制中心,我们所发送的所有消息和执行的所有命令都在这里有记录。FrontController的构造函数一般只有一句话:
?
public?function?MyFrontControl()?
{?
????this.addCommand(EVENT_NAME,Command);?
}

?

?

FrontController一个重要的任务就是它监听所有的Event,并且为这些消息指定相应的Command。在此提醒一下,我们需要在界面中声明FrontController,举例如下:
?
<s:Application?xmlns:control="control.*">?
????????<fx:Declarations>?
????????????<control:MyFrontControl/>?
????????</fx:Declarations>?
</s:Application>
?
MyFrontControl是位于control包中的一个自定义FrontController。

 Model

 Model定义了一个ModelLocator接口,我们只需要实现它并且写成一个单例模式即可。Model部分一般存放需要绑定在页面的数据。
?
package?model?
{?
????import?com.adobe.cairngorm.model.ModelLocator;?
????????import?vo.VO;????
??
????[Bindable]?
????public?class?MyModelLocator?implements?ModelLocator?
????{?
????????public?var?vo:VO;?
????????private?staticvar?modelLocator:MyModelLocator;?
??????????
????????public?staticfunction?getInstance():MyModelLocator{?
????????????if(modelLocator==null){?
????????????????modelLocator=new?MyModelLocator();?
????????????}?
????????????return?modelLocator;?
????????}?
????}?
}

 View

 View部分就是页面了,这部分需要注意的就是声明ServiceLocator和FrontControl。ServiceLocator的声明和我们之前提到的FrontControl是一样的。View部分的作用就是提供界面,发送信号,响应绑定数据变化。

 VO

 Value?Object部分说简单点就是一个个对象,虽然Cairngorm定义了VO的一些接口,但是实际上可以不用。

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

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

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

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

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

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

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

(编辑:李大同)

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

    推荐文章
      热点阅读