Cairngorm示例--業(yè)務(wù)邏輯如何管理視圖(I)
Posted on 2006-12-27 01:31 云自無心水自閑 閱讀(1795) 評論(0) 編輯 收藏 所屬分類: Flex 、Cairngorm 、Flex2當(dāng)服務(wù)端或者客戶端的邏輯變化后,有很多種方法來更新視圖。我比較推薦使用ModelLocator策略,主要是使用Flex的綁定功能。
通常你的視圖與ModelLocator的屬性綁定,這些屬性可以由命令或者其他的業(yè)務(wù)邏輯或者其他視圖所改變。而一旦這些屬性發(fā)生了變化,所有與它們綁定的視圖都隨之變化。
因?yàn)楹芏嗟腃airngorm的例子都想做得淺顯易懂,因此經(jīng)常是簡單地將這些屬性做為ModelLocator中的一個暴露給外界的成員變量。而當(dāng)Cairngorm的應(yīng)用變得龐大的時候,這往往是不夠的。在此我將會專門針對這個問題展示一個例子。這個例子是一個股票市場的顯示表。
第一次迭代:將應(yīng)用運(yùn)轉(zhuǎn)起來
首先看一下Cairngorm所主張的MVC模式。目前股票市場顯示表將只包含一些簡單的UI控制。點(diǎn)擊“GetQuote”來派發(fā)Cairngorm事件,調(diào)用命令來請求一個新報價。StockMarketPod.mxml中在Button的Click事件中派發(fā)Cairngorm事件。

相應(yīng)的腳本代碼:
?








GetStockQuoteCommand響應(yīng)并處理這個Cairngorm事件,請求一個業(yè)務(wù)代理類來報價。








在實(shí)際情況中,需要進(jìn)行一個遠(yuǎn)程的服務(wù)器端的調(diào)用,在Demo中,為簡化起見,我注釋掉了遠(yuǎn)程調(diào)用的相關(guān)代碼。這里StockMarketDelegate.as只是對命令進(jìn)行回調(diào)。






























我們的StockMarketPod視圖只需要兩條消息,
1. 股票的報價
2. 錯誤消息
因?yàn)楝F(xiàn)在是第一次迭代過程中,處理比較簡單,因此使用ModelLocator的成員來解決。


在此Demo中,GetStockQuoteCommand命令模擬返回相應(yīng)的結(jié)果。


















StockMarketPod視圖綁定這些成員并進(jìn)行一些格式化的處理。






格式化函數(shù)的腳本






現(xiàn)在我們來進(jìn)行重構(gòu)并將一些功能從視圖中抽取出來到一個可以進(jìn)行單元測試的工具類中。
第二次迭代,創(chuàng)建符合需求的業(yè)務(wù)邏輯
現(xiàn)在我們已經(jīng)有一個可以運(yùn)行的最簡單的應(yīng)用。當(dāng)你的應(yīng)用變得龐大后,將會有很多的限制。你會發(fā)現(xiàn)你的ModelLocator非常的臃腫,以致于有時候,你都找不到你所要的成員。甚至?xí)忻麤_突的事情發(fā)生。
一個普通的重構(gòu)方法是封裝你的用例圖中的成員成為一個業(yè)務(wù)對象。這個業(yè)務(wù)對象能夠表達(dá)業(yè)務(wù)上下文中需要的視圖信息。你可以把業(yè)務(wù)對象設(shè)計得最適合用例圖的粒度。在一個大型的應(yīng)用中,你可能會設(shè)計一系列的業(yè)務(wù)對象來表達(dá)你的用例。你的視圖將會綁定這些對象或者這些對象的屬性上。通過這種方法,ModelLocator與其目標(biāo)之間的聯(lián)系更容易,開發(fā)者更容易掌握業(yè)務(wù)邏輯所包含的內(nèi)容。
在這個Demo中,我們可以把a(bǔ)stStockQuote和stockQuoteError這兩個成員封裝到一個業(yè)務(wù)對象中。














這樣在ModelLocator中,我們只需要定義一個成員
public var stockQuote : StockQuote = new StockQuote ();
我們的視圖也相應(yīng)修改為:





