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

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

         大家都知道我们在开发后台的时候,都会使用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: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

 


相关文章:

  • Clink(Powerful Bash-style command line editing )
  • 通俗理解C#委托和事件
  • Select Year,Month,Day date from DropDownList control in ASP.NET
  • Codeforces Round #261 (Div. 2) D 树状数组应用
  • MFC三种不同方式实现图形的保存和重绘---方法一:通过集合类CPtrArray保存点的坐标...
  • String,StringBuffer与StringBuilder的差别??
  • jsp+servlet 分页笔记
  • web 开发之js---js 实现地址栏的表单提交加密编码
  • Java操作mongoDB2.6的常见API用法
  • HTMLHelper
  • 微软公有云魅力之Websites
  • 多视图控制器 (一个界面需要多个tableview CollectionView时)
  • 猜数字
  • SQL Server 触发器
  • 微信支付开发(1) JS API支付
  • @angular/forms 源码解析之双向绑定
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【前端学习】-粗谈选择器
  • axios 和 cookie 的那些事
  • JAVA多线程机制解析-volatilesynchronized
  • JS基础之数据类型、对象、原型、原型链、继承
  • LeetCode29.两数相除 JavaScript
  • Logstash 参考指南(目录)
  • mac修复ab及siege安装
  • Making An Indicator With Pure CSS
  • MYSQL 的 IF 函数
  • webgl (原生)基础入门指南【一】
  • 测试开发系类之接口自动化测试
  • 基于组件的设计工作流与界面抽象
  • 力扣(LeetCode)21
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 深度学习中的信息论知识详解
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 用jQuery怎么做到前后端分离
  • 云大使推广中的常见热门问题
  • 怎样选择前端框架
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • (02)vite环境变量配置
  • (09)Hive——CTE 公共表达式
  • (1)虚拟机的安装与使用,linux系统安装
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C语言)字符分类函数
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (搬运以学习)flask 上下文的实现
  • (二)Linux——Linux常用指令
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (强烈推荐)移动端音视频从零到上手(上)
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)c52学习之旅-流水LED灯
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)mysql使用Navicat 导出和导入数据库