当前位置: 首页 > news >正文

Flex Cairngorm详解

本文来自:http://www.cnblogs.com/zhainanJohnny/archive/2010/11/28/1890301.html  

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调用远程服务:
view source print ?
1private var remoteObject:RemoteObject = ServiceLocator.getInstance().getRemoteObject("countingService");
  其中 “countingService”在ServiceLocator中通过如下方式定义:
view source print ?
1<?xml version="1.0" encoding="utf-8"?>
2<cairngorm:ServiceLocator xmlns:fx="http://ns.adobe.com/mxml/2009" 
3         xmlns:s="library://ns.adobe.com/flex/spark" 
4         xmlns:mx="library://ns.adobe.com/flex/mx"
5         xmlns:cairngorm="com.adobe.cairngorm.business.*">
6    <fx:Declarations>
7        <s:RemoteObject id="counting" destination="countingService"/>
8    </fx:Declarations>    
9</cairngorm:ServiceLocator>

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

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

view source print ?
1public function CountDelegate(responder:IResponder)
2{
3    this.responder = responder;
4}

 

 

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

 

  Command

  Command部分包含所有可执行的命令,你可以理解为所有的后台函数调用都在Command部分完成,至于Command如何完成这些任务我们稍后再说。Command部分定义了ICommand接口,并且需要实现一个叫做execute()的方法。我们可已通过定义自己的Command来完成我们需要的任务,所有的Command命令都要实现ICommand和IResponder接口,IResponder接口定义了result()和fault()方法,所以我们自定义的Command应当是如下效果:
view source print ?
01package command
02{
03    import com.adobe.cairngorm.commands.ICommand;
04    import com.adobe.cairngorm.control.CairngormEvent;
05    import mx.rpc.IResponder;
06    import mx.rpc.events.ResultEvent;
07    public class CountCommand implements ICommand, IResponder
08    {       
09        public function CountCommand()
10                {       
11        }       
12        public function execute(event:CairngormEvent):void
13        {
14        }   
15        public function result(data:Object):void
16        {
17        }   
18        public function fault(info:Object):void
19        {
20        }
21    }
22}
  其中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中有这么一句话:
view source print ?
1responder.result(objec);
object一般是要返回的值或者服务相关信息。

  Control

  COntrol部分定义了三个基类:CairngormEvent, CairngormEventDispatcher, FrontController。
  CairngormEvent定义一个Event,一般在CairngormEvent中存储数据模型,例如我们要做一个用户登录页面,点击登录按钮之后我们就发送一个包含用户名和登录密码的event,我们可以把用户名和登录密码封装在一个类中(这就是后面我们要说的VO)然后放入event里面。
  CairngormEventDispatcher是一个单例模式,它的作用就是发送消息,一般用如下方法调用:
view source print ?
1CairngormEventDispatcher.getInstance().dispatchEvent(CairngormEvent);
FrontController相当于一个控制中心,我们所发送的所有消息和执行的所有命令都在这里有记录。FrontController的构造函数一般只有一句话:
view source print ?
1public function MyFrontControl()
2{
3    this.addCommand(EVENT_NAME,Command);
4}
FrontController一个重要的任务就是它监听所有的Event,并且为这些消息指定相应的Command。在此提醒一下,我们需要在界面中声明FrontController,举例如下:
view source print ?
1<s:Application xmlns:control="control.*">
2        <fx:Declarations>
3            <control:MyFrontControl/>
4        </fx:Declarations>
5</s:Application>
MyFrontControl是位于control包中的一个自定义FrontController。

  Model

  Model定义了一个ModelLocator接口,我们只需要实现它并且写成一个单例模式即可。Model部分一般存放需要绑定在页面的数据。
view source print ?
01package model
02{
03    import com.adobe.cairngorm.model.ModelLocator;
04        import vo.VO;   
05  
06    [Bindable]
07    public class MyModelLocator implements ModelLocator
08    {
09        public var vo:VO;
10        private static var modelLocator:MyModelLocator;
11          
12        public static function getInstance():MyModelLocator{
13            if(modelLocator==null){
14                modelLocator=new MyModelLocator();
15            }
16            return modelLocator;
17        }
18    }
19}

  View

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

  VO

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

  
  了解了这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部分做出相应变化。
  
  想进一步学习请看Flex Cairngorm入门例子

转载于:https://www.cnblogs.com/wyyLick/archive/2011/10/21/2219846.html

相关文章:

  • 宽带接入
  • MongoDBTool - 测试版【GUI美化完毕】 源代码发布 --MongoDB爱好者,Winform爱好者 请进...
  • .net 流——流的类型体系简单介绍
  • 把Javascript放置到何处
  • live555学习笔记6-建立RTP会话
  • 谈谈Ext JS的组件——组件基类:Ext.Component
  • 玩转VIM编辑器-导航移动
  • [翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间
  • 让Windwos Server 2008 R2 SP1的FTP真正能访问
  • 20天android学习
  • 库函数实现之字符串拷贝
  • Xqk.Data数据框架使用说明之:如何自定义数据表名
  • 优化SqlServer--数据压缩
  • devexpress chart 柱形图
  • 我的电脑搜索这个功能不能打开
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • github指令
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript对象详解
  • JS数组方法汇总
  • PaddlePaddle-GitHub的正确打开姿势
  • React-flux杂记
  • React中的“虫洞”——Context
  • Redis 中的布隆过滤器
  • spring-boot List转Page
  • windows下mongoDB的环境配置
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • Xmanager 远程桌面 CentOS 7
  • 翻译--Thinking in React
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端设计模式
  • 山寨一个 Promise
  • 鱼骨图 - 如何绘制?
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • NLPIR智能语义技术让大数据挖掘更简单
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​Python 3 新特性:类型注解
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #stm32驱动外设模块总结w5500模块
  • $.proxy和$.extend
  • ()、[]、{}、(())、[[]]命令替换
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (五)c52学习之旅-静态数码管
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (一)基于IDEA的JAVA基础1
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)程序员疫苗:代码注入
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET 服务 ServiceController
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET开源项目介绍及资源推荐:数据持久层