大家都知道我们在开发后台的时候,都会使用MVC,三层等分层架构,使后台代码达到职责更为分明单一,高内聚低耦合,比如,Dao层仅仅是进行和数据库打交道,负责处理数据;Service(B层)仅仅是进行逻辑推断处理,而Action则进行后台和前台页面的交互等。从而使程序更加easy管理,更加灵活,更加easy扩展,更加easy维护。也就是大家比較熟悉的Struts(SpringMVC)+Spring+Hibernate(Mybatis)等。

而作为前台Flex处理,也提供了相似的处理功能,想要达到的效果,也是代码分层,易于管理,易于扩展,易于维护。而Flex的前台微框架包含第一代PureMVC(百科)和Cairngorm(百科)和第二代Swiz(百科),Mate(资料)和Robotlegs(百科资料)。当然了二代微架构是基于一代上发展来的,加入了控制反转,依赖注入(相似于Spring)。可是这几个都是为了分层解耦,而我这里重点阐述一下Cairngorm3这个框架,由于此框架还是比較成熟,非常多企业都在使用。其他的留待慢慢学习。

百科:Cairngorm是由adobe公司推出的一个轻量级的FlexRIA程序开发框架。中文名:“烟水晶” 。目的是提高程序的可扩展性、可维护性,其本身并非一个完整的企业应用,它仅仅是提供了一个开发骨架,Adobe称之为体系。Cairngorm主要就是对开发Flex应用程序应用了一系列的设计模式,从而使开发出来Flex程序可扩展性,可维护性都大大提高。代价就是异常繁琐的文件书写。往往为了完毕一个简单的功能须要改动n个文件。所以小项目不建议使用。

先看一张图,来总体熟悉一下Cairngorm的处理流程,注意细致看,这张官方图事实上画的非常好的:

好,看一下组成,Cairngorm框架将Flex的前台处理,分成了MVC的层次结构

1,VO(ValueObject):存储特定值对象变量,普通情况是和Java中的DTO(Data Transfer Ojbect)相应的,通过这些对象来传递数据,实现flex和Java端的通信,当然通过String,int,list等基本类型也是能够的。看一个简单样例:

	package com.ljh.vo
{
import com.adobe.cairngorm.vo.ValueObject; //前台业务功能
[RemoteClass(alias="com.ljh.dto.IdCardRequestDto")]
public class IdCardRequestVo implements ValueObject
{
public var name:String; //姓名
public var sex:String; //性别
public var birthDay:String; //生日
public var idCard:String; //身份证号
public var address:String; //地址
public var telephone:String;//补充的电话号码
public var marryStatue:String;//婚姻状况 } }

2,Model Locator:使用singleton模式进行共享变量,里边存储了一些值对象。相似我们Java项目中的Session对象。界面使用赋值和后台使用赋值都能够对其进行操作交互。

	/**
* 查询功能 模型。
* */
[Bindable]
public class DrugModelLocator implements ModelLocator
{
private static var drugModelLocator:DrugModelLocator; public function DrugModelLocator()
{
if (drugModelLocator != null)
{
throw new Error("Only one DrugModelLocator instance should be instantiated");
}
} public static function getInstance():DrugModelLocator
{
if (drugModelLocator == null)
{
drugModelLocator=new DrugModelLocator();
}
return drugModelLocator;
}
//身份证信息
public var idCardRequestVo:IdCardRequestVo; //返回的建卡list信息
public var cardArray:ArrayCollection; }
}

3,View(视图):一个或多个Flex组件(button,panel,box,自己定义组件等)组成,将Model中的数据进行绑定显示,并侦听用户触发界面的Event,进行相应的通知处理。

4,Controller(控制器):侦听Caringorm事件并将其映射到Command处理中。起到配发任务,核心控制的作用。相当于指挥官。看一个样例非常easy的:

	/**
* @description FLEX的控制器
* @author ljh
*/
public class FSController extends FrontController
{
public function FSController()
{
//super();
initialiseCommands();
} /**
*@description 向控制器注冊命令类
*/
public function initialiseCommands():void
{
//addCommand进行事件和命令的映射加入。
addCommand(DeviceEvent.Event_CHECKDEVICEBYIPANDMAC, CheckDeviceByIpAndMacCommand);
}
}

5,Command(命令):处理业务逻辑,进行调用Delegate或其他Command进行更新Model.这里须要实现Icommand,IResponder,重写里边的方法,execute是运行调用的java后台方法,onResult是正确返回处理方法,onFault为错误返回处理的方法。

public class DrugCommand implements Command, Responder
{
private var drugModelLocator:DrugModelLocator=DrugModelLocator.getInstance(); private var drugEvent:DrugEvent; [Bindable]
public var pageTo:PageChangeUtil=PageChangeUtil.getInstance(); //运行的方法
public function execute(event:CairngormEvent):void
{
drugEvent=DrugEvent(event);
var drugDelegate:DrugDelegate = new DrugDelegate(this);
//调用建卡的方法
var idCardRequest:IdCardRequestVo=drugEvent.idCardRequestVo;
drugDelegate.createCard(idCardRequest);
} //成功返回的方法
public function onResult(event:*=null):void
{
var result:ArrayCollection=event.result as ArrayCollection;
//将返回值附到model中
drugModelLocator.cardArray=result;
if(drugEvent != null)
{
drugEvent.callBack.call(null,result);
}
}
public function quit():void
{
pageTo.back();
}
//失败返回的方法
public function onFault(event:*=null):void
{
var obj:Object = event.fault.rootCause;
var message:String = obj.message;
if(drugEvent.faultCallBack != null)
{
drugEvent.faultCallBack.call(null,message);
}
}
}

6,Delegate(托付),实例化(通过远程调用Http,WebService,Remote Object),并将结果返回给Command。看一下样例:

public class DrugDelegate
{
private var responder:Responder;
private var services:Object; public function DrugDelegate(responder:Responder)
{
this.responder=responder; //ljh
this.services=ServiceLocator.getInstance().getRemoteObject("cardAndChargeFacade");
} //建卡信息
public function createCard(idCard:IdCardRequestVo):void
{
//调用远程类的方法
var call:Object=services.careteCardById(idCard);
call.resultHandler=responder.onResult;
call.faultHandler=responder.onFault;
}
}

7,Service(服务),定义链接到远程数据库的远程过程调用(HTTP,Web Services等) :

<cairngorm:ServiceLocator xmlns:cairngorm="com.adobe.cairngorm.business.*"
xmlns:mx="http://www.adobe.com/2006/mxml">
<!-- 依据身份证建卡-->
<mx:RemoteObject id="cardAndChargeFacade"
destination="cardAndChargeFacade"
showBusyCursor="true"
result="event.token.resultHandler( event );"
fault="event.token.faultHandler( event );">
</mx:RemoteObject> </cairngorm:ServiceLocator>

好,上边为Cairngorm的组成部分,Service通过远程获代替理类,Delegate调用它,运行方法,返回数据,给Command,Command业务处理,通过Controller和Event进行映射关联,Event响应用户的事件处理,进行数据处理。总之就是这样一个流程。过程麻烦,可是还是比較简单。这里提供很多其他学习Cairngorm的资料:

http://blog.dreamhui.net/archives/64

http://www.cnblogs.com/zhainanJohnny/articles/1890356.html

http://nijiaben.iteye.com/blog/257183

Flex入门(三)——微架构之Cairngorm的更多相关文章

  1. 微服务(入门三):netcore ocelot api网关结合consul服务发现

    简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...

  2. DevExpress XtraReports 入门三 创建 Master-Detail(主/从) 报表

    原文:DevExpress XtraReports 入门三 创建 Master-Detail(主/从) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用 ...

  3. 朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下)

    朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下) [下载本文PDF进行阅读] 接上文,继续剩下的15个模式. 数据管理模式 16.分片模式:将数据存储区划分为一组水平分区或分片 一直有一个说 ...

  4. 手机服务器微架构设计与实现 之 http server

    手机服务器微架构设计与实现 之 http server ·应用 ·传输协议和应用层协议概念 TCP  UDP  TCP和UDP选择 三次握手(客户端与服务器端建立连接)/四次挥手(断开连接)过程图 · ...

  5. 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

  6. Swift语法基础入门三(函数, 闭包)

    Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...

  7. Thinkphp入门三—框架模板、变量(47)

    原文:Thinkphp入门三-框架模板.变量(47) [在控制器调用模板] display()   调用当前操作名称的模板 display(‘名字’)  调用指定名字的模板文件 控制器调用模板四种方式 ...

  8. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  9. 朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)

    朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上) [下载本文PDF进行阅读] 设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践.在经过多年的软件开发实践之后,回过头来去看23种设 ...

随机推荐

  1. 首次启动优美新手指引tip

    在开发商业应用时候,用户第一次进入app,有种无从下手的感觉,我们作为开发人员要提供可用户一些指引, 这些指引不能让用户看着唐突,要舒服的展示给用户,带着用户愉快的使用我们的app. 怎么让用户舒服呢 ...

  2. HDU 1016 Prime Ring Problem 题解

    Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ... ...

  3. 基于FFMPEG和SDL实现视频播放器

    这个是雷大牛实现的project. http://download.csdn.net/detail/leixiaohua1020/5122959 有兴趣的能够好好研究研究.

  4. 最简单的Java框架

    框架framework的目的是定义骨架式方案,处理各种相同的底层细节:而开发人员使用框架时,能够依照自己的需求实现自己的功能--仅仅须要填入自己的东西/flesh. 最简单的框架,类似于JUnit,它 ...

  5. Linux date -s(转)

    修改linux的时间可以使用date指令 修改日期: 时间设定成2009年5月10日的命令如下: #date -s 05/10/2009 修改时间: 将系统时间设定成上午10点18分0秒的命令如下.  ...

  6. Android开发调节屏幕亮度

    在播放器,我们经常看到这样的设计,即,在用户的特定部分将能够滑动屏幕向上或向下调整屏幕的亮度,上下滑动的某一部分将能够调整播放音量.并以滑动的进程可以进行调整,以玩. 如今,我不得不说一下亮度调节. ...

  7. Sencha Architect 2 的使用

    俗话说的好, 工欲善其事必先利其器, 用Sencha开发的语言, 自己可能不太熟悉, 写出来很麻烦, 于是给大家介绍一个工具. 启动程序第一个界面: 单击第一个Go按钮, 创建一个项目.进入以后, 单 ...

  8. FlexPaper二次开发问题及搜索高亮显示

    原文:FlexPaper二次开发问题及搜索高亮显示 最近有个需求,做一个IT知识库,类似于文库,说到文库肯定会用到在线浏览文档了,所有在网上翻阅了一下类似豆丁的在线浏览器插件的资料,将其进行了二次开发 ...

  9. JQuery Easy Ui (Tree树)详解(转)

    第一讲:JQuery Easy Ui到底是什么呢? 首先咱们知道JQuery是对Java Script的封装,是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等.. JQuery ui是在j ...

  10. _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决

    笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...