Cairngorm的结构及开发使用(2)

有一个feature经 常出现在电子商务应用程序中,它叫做“需求列表”,一种产品的 临时列表用于暂时存放用户以后可能要买的产品但还未加入到购物车中。

    在一个灵活的团队中,需求列表的需求或是说“story”,在CairngormStore中可以这样理解:

CairngormStore 需求列表 

客户除了可以把产品从商店加入到购物篮外,也可以使用需求列表feature来存放他们以后想要买的产品。 

使用tab接 口,客户可以选择把产品放入到购物篮或是需求列表。当客户购买购物篮中的产品时,在需求列表中的产品不会出现。

客户可以使用拖曳产品的图标或是产品列表的描述的方法加入到需求列表,也可以拖曳产 品细则面板中的图标的方法加入到需求列表,还可以按产品细则面板中的“添加”按钮的方法加入到需求列表中。

注意:这种需求不能规定客户可能把物品在需求列表和检验中互相移动。现在假设这种需 求是额外的story

在用户经历之前,这不值得一提。选择tab接口是功能的一种,由J2EE开 发人员实现。在现实世界的工程里,我会使用考虑用户经验,结合需求列表,更加有效地加入到全部的信息架构中去。

作为一种典型的灵活工作,开发人员通常将一个story分为一些小任务。使用Cairngorm微架构,存在于feature中的任务变得更加可见,可重用。你可能记得在第四章中我讨论 过基于feature驱动的开发。

对于上述的需求列表story,我建议story中 的任务是这样的:

l         在前台控制器类中注册一个新的事件addProductToWishList

l         创建一个新一命令AddProductToWishList来响应事件。

l         在模型定位器中创建一个WishList对象

 

实现视图:

l         WishList对 象加入到Tab Navigator控制中去,跟Shopping Card对象同个地方

l         动态绑定WishList对 象到模型定位器中。

l         当用户按下“添加到需求列表”按钮时,广播用户动作到前台控制器。

l         当用户拖曳和放下产品到需求列表对象时,广播用户动作到前台控制器。

让我们遵循这些任务来编码吧!

在前台控制器类中注册事件

第一步是给基于Cairngorm应用程序简要的描述一下,当用户想要把产品加入到他们的需求列表中时,一个新的用户动作就会发生了。

CairngormStore有它自己的前台控制实例,ShopController.as,你可以使用它注册所有可能的CairngormStore命令。

首先,你必须把事件的名称加入到ShopController

public static var EVENT_ADD_PRODUCT_TO_WISH_LIST = "addProductToWishList";

记住,使用static类型定义事件的名称,你可以在编译时间检查事件被广播时是否合法。这确保当被广播为black-hole之前你没发现事件名称拼写错误时,你的应用程序也不会 失败。

接着,你必须注册一个命令类来响应这个事件。这个工作只要在initialiseCommands()方法中加入新的实例:

addCommand( ShopController.EVENT_ADD_PRODUCT_TO_WISH_LIST, new AddProductToWishListCommand() );

这就是前台控制器类实例关心的。现在它认识新的事件,它也知道当这个事件发生时怎么 做。

再接下来,你要创建命令类来响应这个事件:AddProductToWishList 命令类。

创建AddProductToWishListCommand命 令类

让我们来看看新命令类的代码,它很简单,不需要加以说明:

import org.nevis.cairngorm.commands.Command;

import org.nevis.cairngorm.control.Event;

import org.nevis.cairngorm.samples.store.model.ModelLocator;

import org.nevis.cairngorm.samples.store.vo.ProductVO;

 

class org.nevis.cairngorm.samples.store.command.AddProductToWishListCommand implements Command

{

public function execute( event : Event ):Void

   var product : ProductVO = ProductVO( event.data.product ); 

   var quantity : Number = Number( event.data.quantity ); 

   ModelLocator.wishList.addElement( product, quantity );

}

}

这代码一点也不复杂…execute()方法是一个独立的命令实例指针,当ShopController. EVENT_ADD_PRODUCT_TO_WISH_LIST发生时,由前台控制器调用。

Execute()方法简单地添加了适当的产品数量包括当用户按下“添加到需求列表”时将需求列表对象加入到模型 定位器。

再是,你现在可以假定用户接口,视图,通过Flex数据绑定到在模型定位器中的需求列表对象。这就是业务逻辑形式下所 有要做的事。

下一步是确定我们有需求列表对象在模型定位器上。

存储需求列表对象到模型定位器

Cairngorm使得Flex的 开发很简单。自从你有ShoppingCart类在CairngormStore中管理产品列表和这些产品的数量时,你完全 可以简单地重用这个类来实现需求列表对象。需求列表对象毕竟是一个简单的ShoppingCart, 你不必要对这个特别的访问做检查。

下面是加入到ModelLocator.as的代码:

非常简单,你创建一个新的ShoppingCart实例,然 后调用需求列表实例。你在模型定位器的构造器中创建新的实例,如下:

ModelLocator.wishList = new ShoppingCart();

假设你在模型定位器中其它定义中声明了需求列表实例,像这样:

public static var wishList : ShoppingCart;

这真的是全部的工作。你是否感到你可以快速地向Cairngorm应用程序加入新的feature

实现视图

这样我们创建了一个命令类,在前台控制器类中注册,当产品加入到需求列表中时它更新 模型定位器类,你重用了业务对象(ShoppingCart) 来实现我们的需求列表。

在为需求列表创建用户接口时剩下的问题就是确保它动态地绑定到模型定位器中的动态数 据,确保事件ShopController.EVENT_ADD_PRODUCT_TO_WISH_LIST在 任何用户动作发生时返回结果。

你可能感兴趣的:(AIR)