博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flex入门(三)——微架构之Cairngorm
阅读量:6111 次
发布时间:2019-06-21

本文共 4647 字,大约阅读时间需要 15 分钟。

         大家都知道我们在开发后台的时候,都会使用MVC,三层等分层架构,使后台代码达到职责更为分明单一,高内聚低耦合,比如,Dao层仅仅是进行和数据库打交道,负责处理数据;ServiceB层)仅仅是进行逻辑推断处理,而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的层次结构

        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处理中。起到配发任务,核心控制的作用。相当于指挥官。看一个样例非常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);		}	}

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

 

你可能感兴趣的文章
Windows phone 8 学习笔记(3) 通信
查看>>
重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>
Android扩展 - 拍照篇(Camera)
查看>>
JAVA数组的定义及用法
查看>>