`

Cairngorm 基础

    博客分类:
  • Flex
阅读更多
请关注新浪微博 账号:大数据进行时(http://weibo.com/u/3272022684

Cairngorm是指导Flex开发以MVC(Model-View-Control)模式进行的架构框架,它的重点在于给你一个指导性原则,而并非具体实现,它要实现的目的就是提高项目的可维护性和灵活性,和重用(注意是功能上的重用,而非代码级的重用)。

它是一个由多个设计模式组合而成的集合体。

使用它的重点在于遵循它的设计思想,而非使用它的代码。

它解决的问题包括:使用Model保持客户端状态,使用ValueObject方式达到传送数据的目的。

Cairngorm推荐的最佳实践:

   1. 将数据模型几种到一个全局的ModelLocator中。ModelLocator应为单例模式避免变量冲突。
   2. 在控件中使用数据绑定
   3. 合理组织视图,将组件封闭(避免直接对外引用),通过声明组件所需的共有变量(需要能够绑定)从外部接收数据,声明自定义事件来播发组件的业务逻辑。
   4. 功能点驱动的开发,以业务逻辑为驱动(用户引发的操作,系统引发的操作,都通过Event派发,然后交给命令执行)。


Cairngorm 示意图(网好找个看看)
   
   1. Model Locator(模型定位器):存储你的应用中所有的Value Objects(数据)和共享变量在一个位置。和Http的Session对象类似,只是它存储在Flex接口的客户端而不是在中间件应用服务器的服务器端。
   2. View(界面):通过一个或者多个Flex组件(按钮、面板、组合框、Tile等等)组合在一起的一个个命名单元,绑定数据在Model Locator(模型定位器)中,并且产生基于用户操作(点击、滚动、拖拽等)的自定义的Cairngorm事件。
   3. Front Controller(前端控制器):接收Cairngorm事件并映射他们到Cairngorm命令控制器上。
   4. Command(命令控制器):处理商业逻辑,调用Caringorm代理和(或)其它命令。
   5. Delegate(代理):由命令创建,实例化远程过程调用(HTTP、Web Service等等)并且处理命令的返回结果数据。
   6. Service(服务):定义连接远程数据存储的远程过程调用(HTTP、Web Service等等)。

一个例子:

View:

<?xml version="1.0" encoding="utf-8"?>


<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" creationComplete="init()" xmlns:service="service.*">

<!-- 必须引入RemoteObjectService -->

<service:RemoteObjectService id="DataSerivce"/>

	<mx:Script>
		<![CDATA[
			import cairngorm.vo.UserVO;
			import cairngorm.event.LogonEvent;
			import mx.controls.Alert;
			import mx.rpc.events.ResultEvent;
			
			
			private function init() : void{
				
			}
			
			/* 普通访问方式 */
			private function onCustomerRS_BClick() : void{
				
				 this.DataSerivce.CustomerService_RO.addEventListener(ResultEvent.RESULT,onResult); 
				 this.DataSerivce.CustomerService_RO.testPrintln();
				
			}
			
			private function onResult(event : ResultEvent) : void{
				Alert.show(event.result.toString());
			}
			
			/* Cairngorm访问方式  */
			
			private function onCairngormClick() : void{
				
				var userVO : UserVO = new UserVO();
				userVO.userName = this.username_TI.text;
				userVO.passwd = this.passwd_TI.text;
				
				var event : LogonEvent = new LogonEvent(userVO);
				
				event.dispatch();
				
			}
			
			
		]]>
	</mx:Script>
	

	<mx:Button id="customerRS_B" x="63" y="30" label="普通J2EE交互" click="onCustomerRS_BClick()"/>
	<mx:Button x="133" y="250" label="Cairngorm 初版" click="onCairngormClick()"/>
	<mx:TextInput id="username_TI" x="133" y="166"/>
	<mx:TextInput id="passwd_TI" x="133" y="205"  displayAsPassword="true"/>
	<mx:Label x="63" y="168" text="username"/>
	<mx:Label x="63" y="207" text="password"/>
	
</mx:Application>




Event:

package cairngorm.event
{
	import cairngorm.control.UserController;
	import cairngorm.vo.UserVO;
	
	import com.adobe.cairngorm.control.CairngormEvent;
	
	import mx.controls.Alert;

	public class LogonEvent extends CairngormEvent//继承 CairngormEvent
	{
		
		private var _userVO : UserVO;//用户信息,
		
		public function LogonEvent(value : UserVO)
		{
			this._userVO = value;
			super(UserController.LOGON_EVENT);
		}
		
		
		public function set userVO(value : UserVO) : void{
			this._userVO = value;
		}
		
		public function get userVO() : UserVO{
			return this._userVO;
		}
		
	}
}




Controller


package cairngorm.control
{
	import cairngorm.command.UserCommand;
	import cairngorm.event.LogonEvent;
	
	import com.adobe.cairngorm.control.FrontController;

	/* 命令模式,根据不同的String调用不同的Command */
	
	public class UserController extends FrontController
	{
		
		/*
		 当然在这里的 LOGON_EVENT 也可以定义在Event中 ,
		 
		 this.addCommand(LogonEvent.LOGON_EVENT ,UserCommand);
		 
		 效果是一样的
		 
		*/
		public static const LOGON_EVENT : String = "logonEvent";
		
		public function UserController()
		{
			super();
			this.addCommand(LOGON_EVENT,UserCommand);
		}
		
	}
}




Command

package cairngorm.command
{
	import cairngorm.business.UserDelegate;
	import cairngorm.event.LogonEvent;
	
	import com.adobe.cairngorm.commands.ICommand;
	import com.adobe.cairngorm.control.CairngormEvent;
	
	import mx.controls.Alert;
	import mx.rpc.IResponder;

	public class UserCommand implements ICommand, IResponder
	{
		public function UserCommand()
		{
		}
		
		/*  
		处理Flex业务逻辑,调用代理
		*/
		
		public function execute(event:CairngormEvent):void
		{
			var logonEvent : LogonEvent = LogonEvent(event);
			
			var delegate : UserDelegate = new UserDelegate(this);//调用代理
			
			delegate.logon(logonEvent.userVO);
		}
		
		
		/*  
			在result中处理访问服务器后的返回值,
			一般在这里对Model中的数据进行处理,这样在View中就可以动态地改变了
		*/
		
		public function result(data:Object):void
		{
			if(data.result == true){
				
				Alert.show("  允许操作 ");
				
			}else{
				
				Alert.show("  禁止操作 ");
				
			}
			
		}
		/* 
		  当访问J2EE时,出现问题时,调用这个方法
		 */
		public function fault(info:Object):void
		{
		}
		
	}
}



Business

package cairngorm.business
{
	import cairngorm.vo.UserVO;
	
	import com.adobe.cairngorm.business.ServiceLocator;
	
	import mx.rpc.AsyncToken;
	import mx.rpc.IResponder;
	import mx.rpc.remoting.RemoteObject;
	
	public class UserDelegate
	{
		
		private var _responder : IResponder;//返回给Command中的信息
		
		private var _dataService : RemoteObject;//用于调用J2EE接口方法 
		
		private var _result : AsyncToken; //返回值
		
		public function UserDelegate(value : IResponder)
		{
			this._responder = value;
			_dataService = ServiceLocator.getInstance().getRemoteObject("CairngormService_RO");
		}
		
		public function logon(value : UserVO) : void{
			_result = _dataService.testLogon(value);//调用J2EE方法
			_result.addResponder(this._responder);
		}

	}
}



VO


package cairngorm.vo
{
	public class UserVO
	{
		
		private var _userName : String;//用户名
		
		private var _passwd : String;//密码
		
		public function UserVO()
		{
		}
		
		public function set userName(value : String) : void{
			this._userName = value;
		}
		
		public function get userName() : String{
			return this._userName;
		}
		
		
		public function set passwd(value : String) : void{
		
			this._passwd = value;
		}
		
		public function get passwd() : String{
			return this._passwd;
		}

	}
}




ModelLocator:

package cairngorm.model
{
	import com.adobe.cairngorm.model.ModelLocator;

	/* 在这里使用了一个单例模式 */

	public class UserModelLocator implements ModelLocator
	{
		
		public function UserModelLocator()
		{
		}
		
		private static var _instance : UserModelLocator;
		
		public static function getInstance() : UserModel{
			if(_instance == null){
				_instance = new UserModelLocator();
			}
			
			return _instance;
		}
		
		/* 
		
		定义绑定数据,它就相当于一个数据源,在主程序或者Module中声明一个实例
		
		1、操作它来改变页面中的数据,用户交互好,
		
		2、并操作数据库,相当于走两条路
		
		 */
		
		
		

	}
}







MXML文件
<?xml version="1.0" encoding="utf-8"?>
<caringorm:ServiceLocator xmlns:mx="http://www.adobe.com/2006/mxml" 
	xmlns:caringorm="http://www.adobe.com/2006/cairngorm" xmlns:control="cairngorm.control.*">

	<!--
 		 在Application 中必须引入Controller
	-->
	<control:UserController/>
	
	<mx:RemoteObject id="CustomerService_RO" destination="CustomerRemoteService"/>
	
	<mx:RemoteObject id="CairngormService_RO" destination="CairngormRemoteService"/>
	
</caringorm:ServiceLocator>



remote-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service" 
    class="flex.messaging.services.RemotingService">

    <adapters>
        <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
    </adapters>

    <default-channels>
        <channel ref="my-amf"/>
    </default-channels>
    
    <destination id="CustomerRemoteService">
    	<properties>
    		<source>com.sun.CustomerRemoteObject</source>
    	</properties>
    </destination>
    
    <destination id="CairngormRemoteService">
    	<properties>
    		<source>com.cairngorm.TestCairngorm</source>
    	</properties>
    </destination>

</service>



J2EE
package com.cairngorm;

import flex.messaging.io.amf.ASObject;

public class TestCairngorm {
	
	public boolean testLogon(ASObject asObj){
		
		System.out.println("userName ============= " + asObj.get("userName"));
		System.out.println("passwd ============= " + asObj.get("passwd"));
		
		return true;//在Flex端仍然是boolean类型
	}

}



下载例子:

http://download.csdn.net/source/1709904
分享到:
评论

相关推荐

    Cairngorm 中文手册

    在Cairngorm基础上开发RIA, 将会在大大提高开发和维护的效率。 Cairngorm本身并不是一个完整的企业应用, 它只是提供了一个开发的骨架, Adobe称之为体系.在这个体系中包括以下几个部分: 1. Business(业务逻辑...

    Cairngorm开发文档中文版

    5. **事件(Event)**:事件驱动是Cairngorm通信机制的基础。事件可以是自定义的ActionScript类,通过EventDispatcher发送和监听。这种方式使得组件之间松耦合,可以独立地工作和更新。 6. **代理(Proxy)**:代理...

    cairngorm + lcds最小包.rar

    此外,这个最小工程也是一个很好的起点,可以在此基础上根据实际需求扩展和定制。 总的来说,"cairngorm + lcds最小包"为开发者提供了一个实战的平台,深入理解这两者的结合使用,不仅可以提升开发效率,还能帮助...

    Flex 开发架构

    - 在Cairngorm基础上进一步改进,使用FrontController模式可以更好地控制请求处理流程,提高系统的灵活性和可维护性。 5. **轮回转世—Mate样例** - Mate框架提供了一种更加轻量级的选择,适用于那些不需要...

    [cairngorm入门]introducing_cairngorm.pdf

    - **在线教程**:网上有许多关于Cairngorm的教程和博客文章,涵盖了从基础知识到高级主题的内容。 - **社区支持**:Flex开发者社区是寻求帮助和支持的好地方,许多经验丰富的开发者会在论坛和社交媒体上分享他们的...

    cairngorm3实践源码

    5. **Microkernel**: 微内核是Cairngorm3框架的基础,它负责初始化框架的各个部分,包括ModelLocator、CommandMapper和ServiceLocator。 **Cairngorm3与Cairngorm2的区别** 1. **CommandMapper**: Cairngorm3引入...

    Cairngorm.swc文件

    6. **Microkernel**:微内核是Cairngorm的基础架构,它负责初始化和管理框架的其他组件,如命令和事件监听器。 7. **Proxy**:代理类用于在客户端和服务器之间传递数据,它们可以是AMF(Action Message Format)...

    两个Cairngorm实例

    通过实例1,你可以掌握Cairngorm的基础,而在实例3中,你将面临更复杂的挑战,学会如何处理多组件交互和远程服务调用。在学习过程中,不断练习和应用这些概念,你将能够构建出高效、易于维护的Flex应用。

    Flex login flex cairngorm

    1. **Cairngorm架构基础** - **模型(Model)**:存储和管理应用程序的数据。 - **视图(View)**:用户界面,展示数据和接收用户输入。 - **控制器(Controller)**:处理视图的事件,与模型交互,实现业务逻辑...

    Cairngorm一些资料

    《跟我StepByStep学FLEX教程------王一松.pdf》虽然没有明确提及Cairngorm,但作为Flex教程,它应该包含了Flex的基本概念和开发流程,这对于理解Cairngorm的基础和使用环境是有帮助的。通过学习这本教程,开发者可以...

    Cairngorm入门教程整合spring

    教程中还提到了一些初学者常见的疑问和解决方法,比如一些技术问题导致的报错,以及如何获取基础资料等。作者尚吉存希望读者能够通过本教程快速入门Cairngorm,避免浪费时间,而他自己也仍在进一步探索Cairngorm框架...

    cairngorm 初探

    **Cairngorm框架初探** Cairngorm是一种基于ActionScript 3.0的轻量级MVC(Model-View-...通过"**CairegormLogin**"这样的实例,初学者可以快速掌握Cairngorm的核心概念和工作流程,为自己的项目打下坚实的基础。

    flex+cairngorm+java 实例

    综上所述,这个Flex Cairngorm Java实例展示了如何使用这些技术来构建一个完整的RIAs解决方案,其中Flex负责前端展示,Cairngorm作为架构基础,Java处理后端服务,而BlazeDS则作为通信桥梁。通过这样的组合,开发者...

    在eclipse下使用Cairngen 1.2 构建cairngorm项目

    通过Cairngen,开发者可以自动生成Cairngorm项目的大部分基础结构,从而节省时间和精力,专注于业务逻辑和用户体验。 首先,Cairngen简化了Cairngorm架构的搭建过程,包括Controller、Service、Model、Proxy和Event...

    cairngorm框架module学习三

    **模块化基础** 1. **模块定义**:在Cairngorm中,模块通常包含一个或多个服务、模型、控制器和视图组件。它们通过事件和命令来通信,实现各模块间的协作。 2. **ModuleFactory**:负责模块的创建和管理。开发者...

    Cairngorm框架,很好

    Cairngorm框架是Adobe Flex开发中的一个著名MVC(模型-视图-控制器)设计模式实现,它为构建可扩展、模块化和易于维护的Flex应用提供了强大的基础。这个框架由Rorke McCreary在2005年创建,自那时起,它已经成为了...

    Cairngorm学习文档

    4. **CairngormEvent**: 这是Cairngorm框架提供的基础事件类,所有自定义事件类都需要继承CairngormEvent。事件可以携带数据,如视图对象(VO),并用于在视图和命令之间传递信息。 5. **FrontController**: 前端...

Global site tag (gtag.js) - Google Analytics