云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          當(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事件。

          < mx:Button? label ="Get?Quote" ?click ="getQuoteForSymbol();" />

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

          ?
          import?org.nevis.cairngorm.samples.dashboard.events.GetStockQuoteEvent;????????????????????????????????????
          private?function?getQuoteForSymbol()?:?void
          {
          ????var?event?:?GetStockQuoteEvent?
          =?new?GetStockQuoteEvent(?symbolTextInput.text?);
          ????dispatchEvent(?event?);
          }

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

          public?function?execute(?event?:?CairngormEvent?)?:?void
          {
          ????var?symbol?:?String?
          =?GetStockQuoteEvent(?event?).symbol;
          ????var?delegate?:?StockMarketDelegate?
          =?new?StockMarketDelegate(?this?);
          ????delegate.getQuoteForSymbol(?symbol?);
          }


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

          public?function?StockMarketDelegate(?responder?:?Responder?)
          {
          ????
          //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. 錯誤消息
          因?yàn)楝F(xiàn)在是第一次迭代過程中,處理比較簡單,因此使用ModelLocator的成員來解決。

          public?var?lastStockQuote?:?Number;
          public?var?stockQuoteError?:?String;


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

          public?function?onResult(?event?:?ResultEvent?=?null?)?:?void
          {
          ????
          //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視圖綁定這些成員并進(jìn)行一些格式化的處理。

          <mx:FormItem?label="Symbol">
          ????
          <mx:Label?text="{?formatQuote(?model.lastStockQuote?)?}"/>
          </mx:FormItem>
          <mx:FormItem>
          ????
          <mx:Label?text="{?model.stockQuoteError?}"/>
          </mx:FormItem>

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

          private?function?formatQuote(?quote?:?Number?)?:?String
          {
          ????
          return?(?isNaN(?quote?)?)???""?:?String(?quote?);
          }


          現(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ù)對象中。

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

          }


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

          <mx:FormItem?label="Symbol">
          ????
          <mx:Label?text="{?formatQuote(?model.stockQuote.lastStockQuote?)?}"/>
          </mx:FormItem>
          <mx:FormItem>
          ????
          <mx:Label?text="{?model.stockQuote.stockQuoteError?}"/>
          </mx:FormItem>


          主站蜘蛛池模板: 离岛区| 渝中区| 门源| 临潭县| 泸溪县| 安庆市| 固阳县| 海原县| 时尚| 保德县| 周口市| 汕尾市| 探索| 河津市| 无棣县| 尤溪县| 肃宁县| 长治县| 晋城| 荃湾区| 宾阳县| 获嘉县| 金寨县| 岚皋县| 海阳市| 侯马市| 金阳县| 上饶县| 盘锦市| 威宁| 新泰市| 焦作市| 特克斯县| 恩平市| 托克逊县| 苏州市| 仪征市| 丰县| 当涂县| 甘南县| 上栗县|