`
zy77612
  • 浏览: 283432 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Cairngorm中Command、Delegate、Service交互详解

    博客分类:
  • J2EE
阅读更多

Command、Delegate、Service这三者的关系简单说来就是前者调用后者,后者为前者返回数据的关系!

原生的Cairngorm MVC 概览:

Cairngorm中Command、Delegate、Service交互详解 - 果果 - 果果的博客

 

让我们以参考资料中的源码为例详细描述一下:

Command的源代码如下,类名叫:GetProductsCommand

package com.adobe.cairngorm.samples.store.command

{

        import mx.rpc.IResponder;

        import com.adobe.cairngorm.commands.ICommand;

        import com.adobe.cairngorm.control.CairngormEvent;

        import com.adobe.cairngorm.samples.store.business.ProductDelegate;

        import com.adobe.cairngorm.samples.store.model.ShopModelLocator;

        import com.adobe.cairngorm.samples.store.util.Comparator;

        import mx.rpc.events.ResultEvent;

        import mx.rpc.events.FaultEvent;

        import mx.controls.Alert;

        import mx.collections.ICollectionView;

        import mx.collections.Sort;

        import mx.collections.SortField;

        import mx.utils.ArrayUtil;

 

        public class GetProductsCommand implements ICommand, IResponder

        {

               public function execute( event : CairngormEvent ): void

               {

                  if( ShopModelLocator.getInstance().products == null )

                  {

                      var delegate : ProductDelegate = new ProductDelegate( this );

                      delegate.getProducts();

                   }

                   else

                   {

                        Alert.show( "Products already retrieved!" );

                        return;

                    }

               }

 

               public function result( event : Object ) : void

               {      

                 //result()方法从表现服务器结果的event

中提

                 //

products数组并将它们保存在

ShopModelLocator中,

                 //同时将

selectedItem

设置为产品列表中的第一个产品。

                 var products : ICollectionView = ICollectionView( event.result );

                 var model : ShopModelLocator = ShopModelLocator.getInstance();

                 // sort the data。

                 var sort :Sort = new Sort();

                 sort.fields = [ new SortField( "name", true ) ];

                 products.sort = sort;

                 products.refresh();

               // set the products on the model

                 model.selectedItem = products[ 0 ];

                 model.products = products;

                 model.workflowState = ShopModelLocator.VIEWING_PRODUCTS_IN_THUMBNAILS;

               }

 

               public function fault( event : Object ) : void

               {

                  var faultEvent : FaultEvent = FaultEvent( event );

                  Alert.show( "Products could not be retrieved!" );

               }

        }

 }

注意代码中的这一行:

var delegate : ProductDelegate = new ProductDelegate( this );

这里将GetProductsCommand类的实例作为参数(this)传递给ProductDelegate的构造函数,这样做就是告诉Delegate,该Command将处理所有通过Dlegate发送的请求所返回的结果。在Delgate中,这个接收所有返回结果的Delegate成为Responder。如下Delegate的源码(ProductDelegate.as)中可以看到:

package

com.adobe.cairngorm.samples.store.business

{

        import mx.rpc.IResponder;

        import com.adobe.cairngorm.business.ServiceLocator;

        import mx.rpc.events.FaultEvent;

        import mx.rpc.events.ResultEvent;

        import mx.rpc.AbstractOperation;

 

        public class ProductDelegate

        {

               //构造函数的参数为IResponder类,将接受所有请求的返回结果

               public function ProductDelegate( responder : IResponder )

               {             

                       this.service = ServiceLocator.getInstance().getRemoteObject( "productService" );

                       this.responder = responder;

               }

               public function getProducts() : void

               {                     

                       //调用Service,这两行代码可以作为模板,在其他Cairngorm应

                       //用中写法也是一样的!这两行代码确保了从服务器返回的

                       //results 和faults都能返回给Delegate。

                       var call : Object = service.getProducts();

                       call.addResponder( responder );

               }

               private var responder : IResponder;

               private var service : RemoteObject;

        }

}

从第一段代码中可以看到,Command类实现了ICommand和 IResponder两个接口,当它选择扮演responder的角色,Command实现FLEX定义的IResponder接口;这确保了开发者可以添加一个

result()犯法来处理任何

Delegate结果,一个

fault()方法来处理所有

Delegate的错误。

整个工作流程可以描述如下:

1、Command类产生一个业务代理(delegate)的实例;

2、Command类调用delegate中的业务处理方法,上例中为getProducts();

3、Delegate查找到service,并调用service;

4、过了一会,服务器返回结果给delegate;

5、Delegate立即将结果传给command的result()方法或者调用command的fault()方法。

通过这个机制的运用,一方面使得Delegate可以被重用,另一方面将服务器端调用进行了封装,delegate变成了客户端代码和服务器端代码的唯一接口。这样做也为客户端和服务器端代码分别开发提供了可能(我们在写客户端程序是不一定服务器端程序已经就绪,只需要它提供一些静态试验数据(或称为为数据:dummy data)即可)。

==================================================

参考资料:

1)Developing Flex RIAs with Cairngorm microarchitecture – Part 5: Server-side integration

分享到:
评论

相关推荐

    Flex 使用 Cairngorm 框架与java进行数据交互

    前台FLex工程(单独工程Cairngorm)使用Cairngorm框架与后台java工程(FLexToJava)进行数据交互。功能点: ...附带:数据库sql在java工程中,测试通过,完整的flex使用框架Cairngorm向java后台数据交互

    Flex之使用Cairngorm(3) - Command & Event

    本篇文章将深入探讨Cairngorm框架中的Command和Event机制,这是Cairngorm核心架构的重要组成部分。 首先,我们来看一下Command模式。在Cairngorm中,Command模式用于处理业务逻辑和事件响应。当一个用户交互发生...

    Cairngorm例子

    而"catalog.xml"可能是应用程序的配置文件,列出库中可用的组件或资源,或者它可能包含了关于Cairngorm框架如何组织和交互的信息。 通过深入理解Cairngorm框架及其组件,开发者能够构建更加灵活、易于维护的Flex...

    Cairngorm交互示例源文件(JSP后台)

    在本案例中,"Cairngorm交互示例源文件(JSP后台)"可能是一个包含使用Cairngorm框架构建的Flex应用,并与Java服务器端(JSP)进行交互的示例项目。 首先,让我们详细了解一下Cairngorm框架的关键组成部分: 1. **...

    RIA框架Cairngorm

    Cairngorm是Abode推出的Flex RIAs框架,其实...Command(命令):调用Cairngorm Delegate或其它Command,并更新Model; Delegate(委托):实例化RPC(远程过程调用)并将其结果返回给Command; Business(业务):定义RPC。

    Cairngorm框架配置

    ### Cairngorm框架配置详解 #### 一、Cairngorm框架概述 Cairngorm是一种专门为Adobe Flex设计的模型-视图-控制器(Model-View-Controller, MVC)架构模式框架。它通过清晰地分离应用逻辑,使得开发更加模块化、可...

    Cairngorm开发文档中文版

    在Cairngorm中,它主要用来查找和实例化Command对象。 8. **商店(Store)**:商店是另一种模式,用于集中管理和访问模型对象。它允许组件以声明式的方式获取模型数据,而无需直接引用模型。 9. **命令工厂...

    cairngorm中文版

    2. **Command**:命令(Command)是Cairngorm中的关键组件,它们处理用户操作或系统事件,并协调模型和视图之间的交互。每个命令都是一个独立的类,负责执行特定任务。 3. **Service Locator**:服务定位器...

    Flex开发框架cairngorm入门实例教程

    4. **服务(Service)/命令(Command)**:虽然在提供的内容中没有直接涉及,但Cairngorm通常使用命令模式处理业务逻辑。当控制器接收到事件后,会调用相应的Command来执行业务逻辑,例如保存新添加的图书到数据库。...

    cairngorm + lcds最小包.rar

    2. **视图(View)**:Flex组件,负责展示数据和接收用户输入,通常与cairngorm的Command或Proxy进行交互。 3. **控制器(Controller)**:cairngorm的核心部分,包括EventBroker、Commands和Services。EventBroker负责...

    Cairngorm实例教程

    在“Flex 3.0 RIA开发详解-基于ActionScript3.0实现”这本书中,你将看到如何结合ActionScript 3.0的强大力量,利用Cairngorm框架构建高效的Flex应用程序。教程会详细解释每一个步骤,包括设置项目、创建模型、定义...

    cairngorm3实践源码

    **cairngorm3实践源码详解** Cairngorm是Adobe Flex/AIR社区中一个著名的轻量级MVC框架,它为ActionScript 3.0应用程序提供了结构和设计模式,便于开发大型、可维护的项目。这个压缩包包含的是Cairngorm3的实践源码...

    Cairngorm学习文档

    7. **Delegate**: 服务代理,作为与服务交互的单一接触点,持有对ServiceLocator的引用,负责处理与远程服务的通信。 **系统处理流程**: - 视图组件触发CairngormEvent。 - Event被FrontController捕获,并根据...

    Cairngorm入门教程整合spring

    Cairngorm框架主要由五大组件构成,分别是ModelLocator、ServiceLocator、Command、Event以及FrontController。ModelLocator类似于一个存放数据的仓库,用于存储程序中所有的值对象(ValueObjects)和共享变量。...

    Cairngorm简单小例子

    Cairngorm中的控制器是命令(Command)模式的实现,每个命令对应一个特定的业务操作。 4. **命令(Command)**:Cairngorm使用命令模式来处理业务逻辑。当事件发生时,对应的命令被创建并执行。命令可以访问Service...

    Cairngorm 2.0 轻量型框架原理

    Cairngorm 2.0轻量型框架是Adobe Flex应用程序开发中的一种设计模式,它主要解决了MVC(Model-View-Controller)架构在大型、复杂应用中的扩展性和可维护性问题。Cairngorm 2.0通过一系列组件和通信机制实现了更清晰...

    flex与java交互 blaze+cairngorm框架实现用户登录

    标题中的"flex与java交互 blaze+cairngorm框架实现用户登录"是指使用BlazeDS作为数据交换的桥梁,Cairngorm作为前端的架构指导,来实现一个用户登录功能。下面将详细讲解这两个技术以及如何在MySQL数据库中处理登录...

Global site tag (gtag.js) - Google Analytics