MyException - 我的异常网
当前位置:我的异常网» 人工智能 » Flex入门(3)——微架构之Cairngorm

Flex入门(3)——微架构之Cairngorm

www.MyException.Cn  网友分享于:2014-08-05  浏览:0次
Flex入门(三)——微架构之Cairngorm

         大家都知道我们在开发后台的时候,都会使用MVC,三层等分层架构,使后台代码达到职责更为分明单一,高内聚低耦合,例如,Dao层只是进行和数据库打交道,负责处理数据;ServiceB层)只是进行逻辑判断处理,而Action则进行后台和前台页面的交互等。从而使程序更加容易管理,更加灵活,更加容易扩展,更加容易维护。也就是大家比较熟悉的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的层次结构


        1VO(ValueObject):存储特定值对象变量,一般情况是和Java中的DTOData Transfer Ojbect)对应的,通过这些对象来传递数据,实现flexJava端的通信,当然通过Stringint,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;//婚姻状况
			
		}

}

        2Model 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,进行相应的通知处理。

 

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


	/**
	 * @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);
		}
	}

       5Command(命令):处理业务逻辑,进行调用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);
		}
	}
}

      6Delegate(委托),实例化(通过远程调用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;
		}
	}

     7Service(服务),定义链接到远程数据库的远程过程调用(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业务处理,通过ControllerEvent进行映射关联,Event响应用户的事件处理,进行数据处理。总之就是这样一个流程。过程麻烦,但是还是比较简单。这里提供更多学习Cairngorm的资料:

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

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

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

 


文章评论

总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
中美印日四国程序员比较
中美印日四国程序员比较
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
10个调试和排错的小建议
10个调试和排错的小建议
程序员的鄙视链
程序员的鄙视链
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员应该关注的一些事儿
程序员应该关注的一些事儿
Java程序员必看电影
Java程序员必看电影
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
老程序员的下场
老程序员的下场
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
编程语言是女人
编程语言是女人
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
一个程序员的时间管理
一个程序员的时间管理
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
 程序员的样子
程序员的样子
旅行,写作,编程
旅行,写作,编程
程序员必看的十大电影
程序员必看的十大电影
程序员都该阅读的书
程序员都该阅读的书
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员和编码员之间的区别
程序员和编码员之间的区别
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
那些争议最大的编程观点
那些争议最大的编程观点
如何成为一名黑客
如何成为一名黑客
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
我是如何打败拖延症的
我是如何打败拖延症的
漫画:程序员的工作
漫画:程序员的工作
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
我的丈夫是个程序员
我的丈夫是个程序员
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有