云自无心水自闲

天平山上白云泉,云自无心水自闲。何必奔冲山下去,更添波浪向人间!
posts - 288, comments - 524, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

上次介绍了如何在业务逻辑中改变视图,这次讲解一种新方法。我们的股票市场显示图将扩展为多股票报价查询器。我们将看到业务逻辑是怎么调整每个视图的。而且我们还会接触到无状态命令是怎么使得事情变得简单。
第三次迭代--创建业务逻辑管理多视图
我们经常可以发现会有很多个类型一样的视图,其背后的功能也非常类似。每个视图显示一个Model对象。这些视图可以在开始时从管理对象处请求一个Model对象。比如:我们的StockMarketDashboard.mxml可以进行这样的添加:

< view:StockMarketPod 
    
quoteId ="quote1"  
    title
="Stockmarket first pod" />
< view:StockMarketPod 
    
quoteId ="quote2"  
    title
="Stockmarket second pod" />
< view:StockMarketPod 
    
quoteId ="quote3"  
    title
="Stockmarket third pod" />
< view:StockMarketPod 
    
quoteId ="quote4"  
    title
="Stockmarket fourth pod" />

注意:视图需要传递一些唯一的标识,我们将这些标识添加到StockQuote类。

package  org.nevis.cairngorm.samples.dashboard.model
{
    
public   class  StockQuote
    
{
        [Bindable]
        
public  var lastStockQuote : Number;
        [Bindable]
        
public  var stockQuoteError : String;        
    }

}


管理对象StockQuoteManager,在ModelLocator实例中初始化。但是StockQuoteManager会是一个怎样的对象呢?
通常我使用Hashmap来实现,其键值就是视图中的唯一标识符。在构造函数中我们可以初始化这个Hashmap,Flex2中我们使用flash.utils.Dictionary

public  function StockQuoteManager() 
{
    stockQuotes 
=   new  Dictionary();
}


getStockQuote方法返回一个stockQuote对象

public  function getStockQuote( quoteId : String ) : StockQuote
{
    var key : String 
=  quoteId;
    
if ( stockQuotes[ key ]  ==   null  )
    
{
        var stockQuote : StockQuote 
=   new  StockQuote();
        stockQuotes[ key ] 
=  stockQuote;
    }

    
return  StockQuote( stockQuotes[ key ] );
}


StockMarketPod.mxml几乎没有什么改动。只需要将那个唯一的标识符发送给命令,因为命令需要从管理对象处取得StockQuote对象。所以GetStockQuoteEvent类多了一个quoteId属性。
在GetStockQuoteCommand中,需要将唯一标识符保存在一个成员变量中

private  var model : ModelLocator  =  ModelLocator.getInstance();
private  var quoteId : String;
         
public  function execute( event : CairngormEvent ) :  void
{
    var stockQuoteEvent : GetStockQuoteEvent 
=  GetStockQuoteEvent( event );             
    var symbol : String 
=  stockQuoteEvent.symbol;
    quoteId 
=  stockQuoteEvent.quoteId;
    var delegate : StockMarketDelegate 
=   new  StockMarketDelegate(  this  );
    delegate.getQuoteForSymbol( symbol );
}

        
public  function onResult( event : ResultEvent  =   null  ) :  void
{
    
// simulate a result from service
    var lastStockQuote : Number  =  Math.random()  *   50   +   5 ;
    var stockQuote : StockQuote 
=  model.stockQuoteManager.getStockQuote( quoteId );
    stockQuote.lastStockQuote 
=  lastStockQuote;
    stockQuote.stockQuoteError 
=   "" ;
}

        
public  function onFault( event : FaultEvent  =   null  ) :  void
{
    var stockQuote : StockQuote 
=  model.stockQuoteManager.getStockQuote( quoteId );
    stockQuote.lastStockQuote 
=  NaN;
    stockQuote.stockQuoteError 
=   " An error occured. " ;
}

注意一下,在上面的代码中我们使用的是无状态命令,在Cairngorm的说明中,无状态命令是每次Cairngorm事件的响应都创建一个新的命令实例的方式。因此,在这种方式中我们可以放心地把变量存储在成员变量中,而不用担心被其他人改变。




只有注册用户登录后才能发表评论。


网站导航: