`

【转】 flex 框架 Cairngorm 中Command、Delegate、Service交互详解(对pureMVC框架完全适用)

 
阅读更多

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)即可)。

分享到:
评论

相关推荐

    Flex框架Cairngorm经典案例源码

    Cairngorm是Flex社区中流行的一种轻量级MVC(Model-View-Controller)框架,它提供了一种结构化的方法来组织和管理Flex项目的代码,从而提高开发效率和代码可维护性。 Cairngorm框架的核心组件包括: 1. **模型...

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

    Cairngorm是一个轻量级的MVC框架,专门用于Adobe Flex应用程序的开发。这个框架的设计目的是为了提高Flex项目的可维护性和可扩展性,通过分离业务逻辑、视图和控制层,使得代码更加模块化。在Cairngorm中,模型...

    Flash/Flex 框架应用 Cairngorm、Mate、PureMVC以及Swiz 的典型例子

    附件是关于 Flash/Flex 几个重要框架 Cairngorm、Mate、PureMVC以及Swiz 的典型例子,由 Tony Hillerson 提供 Homepage: http://insideria.com

    PureMVC教程,PureMVC教程,是学习PureMVC框架的好文章,PureMVC教程,是学习PureMVC框架的好文章,PureMVC教程,是学习PureMVC框架的好文章

    尽管PureMVC相比其他框架如Cairngorm显得更简洁,但它依然提供了强大的架构支持,适用于各种语言平台,如Flex、PHP、Java和Python等。学习和理解PureMVC的原理,可以帮助开发者构建出更加模块化、易于维护的软件系统...

    flex框架之Cairngorm框架(一)

    flex框架之Cairngorm框架,包括Cairngorm框架

    PureMVCCairngorm对Flex开源框架的优化组合

    ### PureMVC与Cairngorm对Flex开源框架的优化组合 #### 一、引言 随着Rich Internet Applications (RIA) 的兴起,Flex 技术因其强大的用户界面设计能力和跨平台特性而受到广泛关注。Flex 不仅能提供丰富的用户体验...

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

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

    Flex MVC框架 Cairngorm 学习笔记

    Cairngorm是一个轻量级的MVC(Model-View-Controller)框架,专为Adobe Flex应用程序设计。这个框架提供了一种结构化的方法来组织和管理Flex应用的复杂性,帮助开发者实现更好的代码复用、模块化和可维护性。在深入...

    flex框架之Cairngorm框架(二)

    Cairngorm是Flex框架中的一个轻量级MVC(Model-View-Controller)设计模式实现,由Adobe社区成员Stephan J. Schmidt在2005年提出。这个框架旨在提高Flex应用的可维护性和可扩展性,通过分离业务逻辑、用户界面和数据...

    flex-Cairngorm框架

    Flex Cairngorm框架详解 Flex Cairngorm框架是Adobe Flex应用程序开发中的一个流行的设计模式,它基于Model-View-Controller(MVC)架构,旨在提高代码的可维护性和可扩展性。Cairngorm框架由SitePen公司开发,最初...

    Spring Actionscript IOC 框架与 Flex Cairngorm MVC 应用开发

    在开发 Flex 应用程序时,Spring Actionscript IOC 框架和 Cairngorm MVC 模式结合使用,可以显著提升代码的可维护性和可扩展性。Spring Actionscript 是一个针对 Actionscript3 设计的轻量级框架,其灵感来源于 ...

    Flex MVC框架下载

    1. **PureMVC**:这是一个轻量级的MVC框架,完全由ActionScript编写,适用于Flex、Flash、AS3等平台。PureMVC提供了一套标准的MVC组件实现,包括Model、View、Controller以及Mediator、Proxy和Command等角色,它们...

    flex 的cairngorm框架实例

    Flex Cairngorm框架实例详解 Flex,作为Adobe的开源富互联网应用(RIA)开发平台,以其强大的MXML和ActionScript支持,为开发者提供了构建交互性强、用户体验优良的应用程序的工具。而Cairngorm框架,则是针对Flex...

    Flex的Cairngorm框架工程 Java后台

    Flex的Cairngorm框架是Adobe Flex开发中的一个轻量级MVC(Model-View-Controller)框架,它为创建可扩展、可维护的富互联网应用程序(RIA)提供了结构和指导。Cairngorm框架主要由Martin Fowler在2005年提出,灵感...

    flex Cairngorm框架实例

    Flex Cairngorm框架是一个强大的轻量级MVC(模型-视图-控制器)架构,用于构建富互联网应用程序(RIA)。这个框架是Adobe Flex开发者社区中的一个流行选择,它旨在提高代码组织、可维护性和可扩展性。让我们深入探讨...

    Flex Cairngorm框架生成器

    Cairngorm是ActionScript和Flex社区中广泛使用的轻量级MVC(Model-View-Controller)框架,它帮助开发者组织和管理大型Flex应用程序的复杂性。通过使用Flex Cairngorm框架生成器,开发者可以快速地自动生成Cairngorm...

    Flex流行MVC框架之Cairngorm小试牛刀

    Cairngorm就是一种在Flex中广泛采用的轻量级MVC框架。 Cairngorm由Adobe的首席架构师Rob Tarran创建,它为Flex应用提供了简单但强大的结构,使得开发者能够更好地管理应用程序的状态和业务逻辑。这个框架的核心组件...

Global site tag (gtag.js) - Google Analytics