Flex Cairngorm詳解

2022-11-24 16:57:45 字數 3650 閱讀 6957

cairngorm是一個開源的flex專案,為flex提供了一個類似mvc的體系結構框架,它是flex ria開發的最好框架之一。使用cairngorm框架可以大大提高開發和維護的效率。

cairngorm說白了就是一大堆的設計模式和功能模組,它分為6部分,分別是:

business(業務邏輯部分)。

command(命令部分)。

control(控制部分)。

model(資料模型部分)。

view(介面部分)。

value object(資料部分)。一般簡稱vo  

先來了解一下這6部分的組成和功能:

business包括兩部分內容:delegate和servicelocator。

servicelocator是一段用於描述遠端服務的mxml檔案,實際上如果不需要呼叫遠端服務的時候我們可以不必寫這樣一個mxml檔案,但是那樣的話cairngorm就失去了它強大的優勢。

delegate相當於一個**,通過command呼叫,它的工作是定位遠端服務並且完成相應的服務呼叫,servicelocator就是這個遠端服務的定義。delegate是一個單例模式(singleton pattern),我們一般用如下的方式通過delegate呼叫遠端服務:

private var remoteobject:remoteobject = servicelocator.getinstance().getremoteobject("countingservice");

其中 “countingservice”在servicelocator中通過如下方式定義:

<?xml version="1.0" encoding="utf-8"?>

當然,我們也可以通過httpservice和webservice呼叫遠端服務,如此的話,在delegate中的呼叫方法也會有變化。cairngorm提供了getremoteobject(), gethttpservice(), getwebservice()三種基本方法分別呼叫remoteobject, httpservice和webservice三種遠端呼叫機制。

每一個自定義的delegate要具有如下的建構函式:

public function countdelegate(responder:iresponder)

為什麼這樣寫,我們在command部分解釋。

command部分包含所有可執行的命令,你可以理解為所有的後臺函式呼叫都在command部分完成,至於command如何完成這些任務我們稍後再說。command部分定義了icommand介面,並且需要實現一個叫做execute()的方法。我們可已通過定義自己的command來完成我們需要的任務,所有的command命令都要實現icommand和iresponder介面,iresponder介面定義了result()和fault()方法,所以我們自定義的command應當是如下效果:

package command

public function execute(event:cairngormevent):void

public function result(data:object):void

public function fault(info:object):void

}}

其中execute()函式宣告一個delegate變數,然後通過這個delegate呼叫相應的方法。command任務的實現實際上是通過delegate完成的,command並不負責定位遠端的服務。另外,command的另外兩個方法——result()和fault()一般用來處理delegate的返回資訊,其中result()是在處理成功時執行,一般是對model進行一些處理(model部分有一個單例模式的modellocator),fault是在處理失敗時候執行。還記得上面我們提到的delegate必須有一個帶有iresponder型別的建構函式嗎?現在我們可以解釋了。

試想,我們用command呼叫delegate來執行遠端服務,當delegate執行完畢之後(或者說呼叫完畢之後)應當如何返回呢?delegate應當如何定位是

哪一個command傳來的執行訊號呢?通過給delegate傳遞一個iresponder變數(實際上這個變數就是command自己)delegate就可以在處理完畢之後直

接呼叫command中的result方法。一般delegate中有這麼一句話:

responder.result(objec);

object一般是要返回的值或者服務相關資訊。

control部分定義了三個基類:cairngormevent, cairngormeventdispatcher, frontcontroller。

cairngormevent定義一個event,一般在cairngormevent中儲存資料模型,例如我們要做一個使用者登入頁面,點選登入按鈕之後我們就傳送一個包含使用者名稱和登入密碼的event,我們可以把使用者名稱和登入密碼封裝在一個類中(這就是後面我們要說的vo)然後放入event裡面。

cairngormeventdispatcher是一個單例模式,它的作用就是傳送訊息,一般用如下方法呼叫:

cairngormeventdispatcher.getinstance().dispatchevent(cairngormevent);

frontcontroller相當於一個控制中心,我們所傳送的所有訊息和執行的所有命令都在這裡有記錄。frontcontroller的建構函式一般只有一句話:

public function myfrontcontrol()

frontcontroller一個重要的任務就是它監聽所有的event,並且為這些訊息指定相應的command。在此提醒一下,我們需要在介面中宣告frontcontroller,舉例如下:

myfrontcontrol是位於control包中的一個自定義frontcontroller。

model定義了一個modellocator介面,我們只需要實現它並且寫成一個單例模式即可。model部分一般存放需要繫結在頁面的資料。

package model

return modellocator;

} }}

view部分就是頁面了,這部分需要注意的就是宣告servicelocator和frontcontrol。servicelocator的宣告和我們之前提到的frontcontrol是一樣的。view部分的作用就是提供介面,傳送訊號,響應繫結資料變化。

value object部分說簡單點就是一個個物件,雖然cairngorm定義了vo的一些介面,但是實際上可以不用。

瞭解了這6大部分之後,我們再來說一說cairngorm的流程:

view部分提供所有可視元件,frontcontrol監聽所有的event。

當使用者操作引起event傳送時,view通過cairngormeventdispatcher傳送event,之後event在frontcontrol接受處理。

frontcontrol將event傳送到相應的command,command呼叫相應delegate。

delegate完成遠端呼叫,返回到command。

command結果處理部分處理返回的資訊,並且對model部分進行修改。

model部分的繫結資料被修改,view部分做出相應變化。

想進一步學習請看flex cairngorm入門例子

flex NaN

如果該值為nan 非數字 則返回true 否則返回false。public function isnan num number boolean 舉例 nan值不是int或uint資料型別的成員。flex開始的時候,有時會遇到nan型別的number資料,如果放任nan不管,程式可能就會出錯退出。這時...

Flex列印

flex html 列印實際上不是 flex 的強項。你是否試過列印複雜的文件?報告是不是看上去總是那麼模糊,很費墨?為了用flex 列印高質量的報告,我想要克服以下幾個主要問題 列印輸出基本上是大影象,需要花費很長時間列印 列印輸出看上去模糊,不夠高質量的文件 文字內嵌在影象裡,非使用印表機或os...

flex measure

繼承 計算元件的預設大小和 可選 預設最小大小。此方法是一種高階方法,可在建立 uicomponent 的子類時覆蓋。您無需直接呼叫此方法。使用addchild 方法將元件新增到某個容器時,以及呼叫元件的invalidatesize 方法時,flex 將呼叫measure 方法。當設定元件的特定高度...