Cairngorm示例--业务逻辑如何管理视图(I)
来源:互联网 发布:矩阵的分解算法 编辑:程序博客网 时间:2024/05/16 12:02
(原文地址:http://www.blogjava.net/usherlight/archive/2006/12/27/90195.html)
当服务端或者客户端的逻辑变化后,有很多种方法来更新视图。我比较推荐使用ModelLocator策略,主要是使用Flex的绑定功能。
通常你的视图与ModelLocator的属性绑定,这些属性可以由命令或者其他的业务逻辑或者其他视图所改变。而一旦这些属性发生了变化,所有与它们绑定的视图都随之变化。
因为很多的Cairngorm的例子都想做得浅显易懂,因此经常是简单地将这些属性做为ModelLocator中的一个暴露给外界的成员变量。而当Cairngorm的应用变得庞大的时候,这往往是不够的。在此我将会专门针对这个问题展示一个例子。这个例子是一个股票市场的显示表。
第一次迭代:将应用运转起来
首先看一下Cairngorm所主张的MVC模式。目前股票市场显示表将只包含一些简单的UI控制。点击“GetQuote”来派发Cairngorm事件,调用命令来请求一个新报价。StockMarketPod.mxml中在Button的Click事件中派发Cairngorm事件。
相应的脚本代码:
private function getQuoteForSymbol() : void
{
var event : GetStockQuoteEvent = new GetStockQuoteEvent( symbolTextInput.text );
dispatchEvent( event );
}
GetStockQuoteCommand响应并处理这个Cairngorm事件,请求一个业务代理类来报价。
{
var symbol : String = GetStockQuoteEvent( event ).symbol;
var delegate : StockMarketDelegate = new StockMarketDelegate( this );
delegate.getQuoteForSymbol( symbol );
}
在实际情况中,需要进行一个远程的服务器端的调用,在Demo中,为简化起见,我注释掉了远程调用的相关代码。这里StockMarketDelegate.as只是对命令进行回调。
{
//disabled for demo
//this.service = ServiceLocator.getInstance().getService( "stockMarketDelegate" );
this.responder = responder;
}
public function getQuoteForSymbol( symbol : String ) : void
{
//disabled for demo
//var call : AsyncToken = service.getQuoteForSymbol( symbol );
//call.resultHandler = responder.onResult;
//call.faultHandler = responder.onFault;
if( symbol == "fail" )
{
responder.onFault();
}
else
{
responder.onResult();
}
}
我们的StockMarketPod视图只需要两条消息,
1. 股票的报价
2. 错误消息
因为现在是第一次迭代过程中,处理比较简单,因此使用ModelLocator的成员来解决。
public var stockQuoteError : String;
在此Demo中,GetStockQuoteCommand命令模拟返回相应的结果。
{
//simulate a result from service
var stockQuote : Number = Math.random() * 50 + 5;
model.lastStockQuote = stockQuote;
model.stockQuoteError = "";
}
public function onFault( event : FaultEvent = null ) : void
{
model.lastStockQuote = NaN;
model.stockQuoteError = "An error occured.";
}
StockMarketPod视图绑定这些成员并进行一些格式化的处理。
<mx:Label text="{ formatQuote( model.lastStockQuote ) }"/>
</mx:FormItem>
<mx:FormItem>
<mx:Label text="{ model.stockQuoteError }"/>
</mx:FormItem>
格式化函数的脚本
{
return ( isNaN( quote ) ) ? "" : String( quote );
}
现在我们来进行重构并将一些功能从视图中抽取出来到一个可以进行单元测试的工具类中。
第二次迭代,创建符合需求的业务逻辑
现在我们已经有一个可以运行的最简单的应用。当你的应用变得庞大后,将会有很多的限制。你会发现你的ModelLocator非常的臃肿,以致于有时候,你都找不到你所要的成员。甚至会有命名冲突的事情发生。
一个普通的重构方法是封装你的用例图中的成员成为一个业务对象。这个业务对象能够表达业务上下文中需要的视图信息。你可以把业务对象设计得最适合用例图的粒度。在一个大型的应用中,你可能会设计一系列的业务对象来表达你的用例。你的视图将会绑定这些对象或者这些对象的属性上。通过这种方法,ModelLocator与其目标之间的联系更容易,开发者更容易掌握业务逻辑所包含的内容。
在这个Demo中,我们可以把astStockQuote和stockQuoteError这两个成员封装到一个业务对象中。
{
public class StockQuote
{
[Bindable]
public var lastStockQuote : Number;
[Bindable]
public var stockQuoteError : String;
}
}
这样在ModelLocator中,我们只需要定义一个成员
public var stockQuote : StockQuote = new StockQuote ();
我们的视图也相应修改为:
<mx:Label text="{ formatQuote( model.stockQuote.lastStockQuote ) }"/>
</mx:FormItem>
<mx:FormItem>
<mx:Label text="{ model.stockQuote.stockQuoteError }"/>
</mx:FormItem>
- Cairngorm示例--业务逻辑如何管理视图(I)
- C#酒店管理系统(内部)业务逻辑
- 2、如何树立业务逻辑
- 结合模式分离GEF的业务逻辑和视图逻辑
- Cairngorm示例:用户登录
- 逻辑卷管理命令示例
- MVC模式中如何区分应用程序逻辑(Controller层)和业务逻辑(Model层)
- MVC模式中如何区分应用程序逻辑(Controller层)和业务逻辑(Model层)?
- Silverlight实战示例4(兼集合属性的妙用)--业务逻辑与服务层
- Silverlight实战示例4(兼集合属性的妙用)--业务逻辑与服务层
- 如何熟悉一个系统的业务逻辑
- 如何理解这个业务逻辑层
- springmvc_mybatis_demo 单元测试(业务逻辑)
- 什么是业务逻辑层(业务层)及业务逻辑层(业务层)的功能
- 使用Cairngorm开发Flex(二):一个好友管理例子
- 业务逻辑
- 业务逻辑
- 业务逻辑
- 不是原型继承那么简单!!prototype的深度探索
- C#.NET图像处理
- 2008年10月23日(星期四)作业
- 用opencms java API获取资源信息
- InstallShield制作JSP+TOMCAT+JDK+MYSQL(第七篇)
- Cairngorm示例--业务逻辑如何管理视图(I)
- 关于javascript数组与VB DLL中中数组的传递问题
- javascript面向对象编程(一)
- 防止对话框因ESC和ENTER键输入关闭的两种途径
- insert 字段带单引号时..
- 入门到底是该学JAVA还是学C# ?
- 游戏程序设计--真实案例分析(一)
- 拥抱Linux
- 工作计划