PureMVC開發(fā)框架使用手冊中文版復(fù)習(xí)過程_第1頁
PureMVC開發(fā)框架使用手冊中文版復(fù)習(xí)過程_第2頁
PureMVC開發(fā)框架使用手冊中文版復(fù)習(xí)過程_第3頁
PureMVC開發(fā)框架使用手冊中文版復(fù)習(xí)過程_第4頁
PureMVC開發(fā)框架使用手冊中文版復(fù)習(xí)過程_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。PureMVC開發(fā)框架使用手冊中文版-PureMVC開發(fā)框架使用手冊目錄(目錄結(jié)構(gòu)=類文件的文件夾結(jié)構(gòu))1HYPERLINKlh1patterns包1.1HYPERLINKlh11開發(fā)框架1.2HYPERLINKlh12框架結(jié)構(gòu)1.3HYPERLINKlh13使用方法1.4HYPERLINKlh14“高內(nèi)聚低耦合”的實現(xiàn)程序架構(gòu)要點2HYPERLINKlh2Facade類3HYPERLINKlh3mvc包3.1HYPERLINKlh31Model類3.2HYPERLINKlh32View類3.3HYPE

2、RLINKlh33Controller類4HYPERLINKlh4media包4.1HYPERLINKlh41Proxy類4.2HYPERLINKlh42Mediator類4.3HYPERLINKlh43Command類4.4HYPERLINKlh44Commands類5HYPERLINKlh5observer包5.1HYPERLINKlh51Observer類5.2HYPERLINKlh52Notifier類5.3HYPERLINKlh53Notice類正文1HYPERLINKlh00patterns包是開發(fā)框架的頂級包,應(yīng)該放在程序的類目錄的根目錄下。1.1HYPERLINKlh00開發(fā)框

3、架開發(fā)框架就是一個空架子,我們可以自己加工、創(chuàng)造零部件,裝配上去,使這個系統(tǒng)按照我們的設(shè)計意圖運行起來。這個開發(fā)框架基于PureMVC框架構(gòu)建,目標(biāo)是開發(fā)出更健壯、易維護(hù)、易擴(kuò)展、可重用的應(yīng)用程序。當(dāng)然,采用這個開發(fā)框架并不等于實現(xiàn)了這個目標(biāo),要實現(xiàn)這個目標(biāo),還需要我們在開發(fā)過程中不斷調(diào)整、不斷優(yōu)化程序架構(gòu)。實現(xiàn)這個目標(biāo)的關(guān)鍵是,降低模塊間的耦合度。1.2HYPERLINKlh00框架結(jié)構(gòu)這個開發(fā)框架分為低耦合的三個層Model、View和Controller。這三部分由三個單例模式類管理,三者合稱為核心層。還有一個單例模式類Faade,是整個系統(tǒng)的管理者。簡單地說,就是三個核心層、一個管理者

4、,其余的就是零部件,可以按需增減。其架構(gòu)如下圖所示:其中:Model負(fù)責(zé)保存Proxy名稱與實例的映射,根據(jù)Proxy名稱獲取其實例。Proxy負(fù)責(zé)保存數(shù)據(jù)對象,存取數(shù)據(jù)。View負(fù)責(zé)保存Mediator名稱與實例的映射、Notice名稱與觀察者的映射,根據(jù)Mediator名稱獲取其實例,根據(jù)Notice通知其觀察者。Mediator負(fù)責(zé)保存視圖組件,操作具體的視圖組件,處理通知。觀察者負(fù)責(zé)保存通知的處理者及其處理方法,收到通知則告知其處理者處理這個通知。Controller負(fù)責(zé)保存Notice名稱與Command類的映射,執(zhí)行通知對應(yīng)的Command。Command負(fù)責(zé)執(zhí)行業(yè)務(wù)邏輯處理通知。

5、Faade是框架的管理者和通信中心,是框架與外界通信的唯一接口,負(fù)責(zé)初始化Model、View、Controller單例,發(fā)送通知。1.3HYPERLINKlh00使用方法開發(fā)框架只是搭建了一個空架子,我們所要做的就是編寫具體的Command、Mediator、Proxy等這些零部件,給它們添加自定義屬性和方法,保存到Model、View、Controller中。在沒有保存Proxy、Mediator和Observer、Command時,Model、View、Controller就是一個空架子。通常,我們需要自定義視圖組件:影片剪輯或聲音放在Flash庫中,它們對應(yīng)的類文件放在包中,F(xiàn)lash

6、的舞臺就是一個自定義視圖組件,文檔類就是舞臺對應(yīng)的類文件。有時,還需要自定義事件、聲音對象、數(shù)據(jù)對象等等。1.4HYPERLINKlh00“高內(nèi)聚低耦合”的實現(xiàn)程序架構(gòu)要點1.4.1什么是高內(nèi)聚低耦合?簡單地說,就是模塊之間不直接互相操作,而是通過中介:通知、事件來實現(xiàn)互操作。舉例一:程序中有兩個對象A、B,當(dāng)A發(fā)生變化時,需要B隨之變化。如果A發(fā)生變化時,只發(fā)出通知或觸發(fā)事件,B負(fù)責(zé)響應(yīng),那么A、B之間就是低耦合關(guān)系。A、B不必知道對方的實現(xiàn)細(xì)節(jié)。如果A發(fā)生變化時,直接調(diào)用B的接口,使B發(fā)生相應(yīng)變化,并獲取操作結(jié)果,那么A、B之間就是強耦合關(guān)系。A、B需要知道對方的一些實現(xiàn)細(xì)節(jié)(屬性或方法)

7、。舉例二:球場上打比賽,As是裁判、Bs是球員,As與Bs需要合作。如果比賽需要暫停,As只是吹哨,Bs聽到號令就停下來,那么As、Bs之間就是低耦合關(guān)系。As、Bs不必抓住對方手腳。如果比賽需要暫停,As直接走過去把Bs控制住,使Bs無法繼續(xù)行動,那么As、Bs之間就是強耦合關(guān)系。1.4.2實現(xiàn)手段程序架構(gòu)要點1、采用事件模型2、采用通知機制3、事件模型和通知機制的結(jié)合2HYPERLINKlh00Facade類包:patterns類:publicclassFaade實現(xiàn):FaadeIFacadeFaade是框架的管理者和通信中心,是框架與外界通信的唯一接口,放在頂級包中,負(fù)責(zé)初始化Model

8、、View、Controller單例,發(fā)送通知。2.1屬性/=只允許自己和子類訪問=protectedvarmodel:Model;/Model單例protectedvarview:View;/View單例protectedvarcontroller:Controller;/Controller單例protectedstaticvarinstance:Facade;/Facade單例protectedconstSINGLETON_MSG:String=Facadealreadyexist!;/消息常量(通常,在自定義Faade類中定義通知名稱常量。因為系統(tǒng)全局都要用。)2.2方法publicf

9、unctionFacade()/構(gòu)造函數(shù),由于Facade是單例,所以應(yīng)調(diào)用單例工廠方法Facade.getInstance(),而不能直接調(diào)用該構(gòu)造函數(shù),否則會拋出異常protectedfunctioninitFacade():void/初始化Facade單例,子類可追加不要替換publicstaticfunctiongetInstance():Faade/Facade單例工廠方法/=創(chuàng)建三個核心層=protectedfunctioninitModel():void/在自定義Faade子類中,若想創(chuàng)建自定義Model并且自定義Proxy初始化時不需要引用Facade,可以重寫這個方法,否則就

10、先調(diào)用這個方法,再注冊Proxy。注意:這個方法很少被重寫,實踐中,你更喜歡用command創(chuàng)建并注冊Proxy,因為存有可變數(shù)據(jù)的Proxy很可能需要發(fā)送Notice,因此在創(chuàng)建時需要引用Facade。protectedfunctioninitView():void/在自定義Faade子類中,若想創(chuàng)建自定義View,或想注冊自定義Observers,可以重寫這個方法,否則就先調(diào)用這個方法,再注冊Mediator。注意:這個方法很少被重寫,實踐中你更可能使用command創(chuàng)建并注冊Mediator,因為Mediator實例需要發(fā)送Notice,因此在創(chuàng)建時需要引用Faade。protected

11、functioninitController():void/在自定義Facade子類中,若想創(chuàng)建自定義Controller,可以重寫這個方法,否則就先調(diào)用這個方法,再注冊command/=與Model層的交互=publicfunctionaddProxy(proxy:IProxy):void/添加proxy實例到Model中publicfunctionretrieveProxy(proxyName:String):IProxy/從Model中獲取proxy實例publicfunctionremoveProxy(proxyName:String):IProxy/從Model中移除proxy實例p

12、ublicfunctionhasProxy(proxyName:String):Boolean/判斷Model中是否有proxy實例/=與View層的交互=publicfunctionaddMediator(mediator:IMediator):void/添加mediator實例到View中publicfunctionretrieveMediator(mediatorName:String):IMediator/從View中獲取mediator實例publicfunctionremoveMediator(mediatorName:String):IMediator/從View中移除media

13、tor實例publicfunctionhasMediator(mediatorName:String):Boolean/判斷View中是否有mediator實例/=與Controller層的交互=publicfunctionaddCommand(noticeName:String,cmd:Class):void/添加Command類到Controller中publicfunctionremoveCommand(noticeName:String):void/從Controller中移除noticeName對應(yīng)的Command類publicfunctionhasCommand(noticeNam

14、e:String):Boolean/判斷Controller中是否有noticeName對應(yīng)的Command類/=與Observer的交互,實現(xiàn)通信機制=publicfunctionsendNotice(noticeName:String,body:Object=null,type:String=null):void/創(chuàng)建并發(fā)送一個通知,這樣,我們在實現(xiàn)代碼中,就不用再創(chuàng)建通知實例了。publicfunctionnotifyObservers(notice:INotice):void/公開這個方法,主要是為了向下兼容,允許你使用faade發(fā)送自定義通知。通常,你可以只調(diào)用sendNotice方

15、法,根本不需要自己創(chuàng)建通知。3HYPERLINKlh00mvc包只有三個核心類,是三個單例,分別實現(xiàn)MVC三個核心層,是框架的主體(media是配件),不可增減。3.1HYPERLINKlh00Model類包:patterns.mvc類:publicclassModel實現(xiàn):ModelIModel負(fù)責(zé)保存Proxy名稱與實例的映射,根據(jù)Proxy名稱獲取其實例。3.1.1屬性/=只允許自己和子類訪問=protectedvarproxyMap:Object;/保存Proxy名稱與實例的映射protectedstaticvarinstance:Model;/Model單例protectedcons

16、tSINGLETON_MSG:String=Modelalreadyexist!;/消息常量3.1.2方法publicfunctionModel()/Model是單例,不能直接調(diào)用該構(gòu)造函數(shù),而應(yīng)該調(diào)用單例工廠方法Model.getInstance(),否則拋出異常protectedfunctioninitModel():void/自動被構(gòu)造函數(shù)調(diào)用,若自定義子類,則在這里添加自定義內(nèi)容,而不必override構(gòu)造函數(shù)publicstaticfunctiongetInstance():Model/Model的單例工廠靜態(tài)方法/=操作Proxy實例的接口=publicfunctionaddPro

17、xy(proxy:IProxy):void/把Proxy實例賦值給proxyMap的屬性,Proxy的名稱作為proxyMap屬性名publicfunctionretrieveProxy(proxyName:String):IProxy/以proxyName為關(guān)鍵字,獲取proxyMap的屬性對應(yīng)的Proxy實例publicfunctionremoveProxy(proxyName:String):IProxy/把proxyMap的屬性名為proxyName的屬性干掉publicfunctionhasProxy(proxyName:String):Boolean/判斷proxyMap的屬性名為

18、proxyName的屬性是否存在3.2HYPERLINKlh00View類包:patterns.mvc類:publicclassView實現(xiàn):ViewIViewView負(fù)責(zé)保存Mediator名稱與實例的映射、Notice名稱與觀察者的映射,根據(jù)Mediator名稱獲取其實例,根據(jù)Notice通知其觀察者。3.2.1屬性/=只允許自己和子類訪問=protectedvarmediatorMap:Object;/存儲Mediator名稱到Mediator實例的映射protectedvarobserverMap:Object;/存儲Notice名稱到觀察者列表的映射protectedstaticva

19、rinstance:View;/View單例protectedconstSINGLETON_MSG:String=Viewalreadyexist!;/消息常量3.2.2方法publicfunctionView()/View是單例,不能直接調(diào)用該構(gòu)造函數(shù),而應(yīng)調(diào)用單例工廠方法View.getInstance(),否則會拋出異常protectedfunctioninitView():void/自動被構(gòu)造函數(shù)調(diào)用,若自定義子類,就在這里設(shè)定自定義內(nèi)容,而不必override構(gòu)造函數(shù)publicstaticfunctiongetInstance():View/View的單例工廠方法/=對觀察者的操作

20、=publicfunctionaddObserver(noticeName:String,observer:IObserver):void/把observer存入觀察者列表中,收到通知,就遍歷對應(yīng)的觀察者列表,通知各個observerpublicfunctionnotifyObservers(notice:INotice):void/通知notice的觀察者列表中的所有觀察者publicfunctionremoveObserver(noticeName:String,processor:Object):void/根據(jù)processor從noticeName的觀察者列表中移除觀察者/=對Medi

21、ator的操作=publicfunctionaddMediator(mediator:IMediator):void/首先把Mediator實例賦值給mediatorMap的屬性,mediatorName作為屬性名。然后,通過名稱獲取Mediator實例,并進(jìn)一步查詢它所關(guān)心的Notice。若返回Notice列表,則創(chuàng)建觀察者(封裝Mediator實例及其handleNotice方法),把觀察者注冊給列表中的每個Notice。最后,觸發(fā)Mediator實例的被注冊事件。publicfunctionretrieveMediator(mediatorName:String):IMediator/根

22、據(jù)Mediator名稱獲取Mediator實例publicfunctionremoveMediator(mediatorName:String):IMediator/首先根據(jù)Mediator名稱獲取Mediator實例,若該Mediator實例存在,則查詢該mediator實例所關(guān)心的Notice,把mediator實例相關(guān)的觀察者從notice的觀察者列表中刪除。然后,把該mediator實例從mediatorMap中刪除。最后,觸發(fā)mediator實例的被刪除事件。publicfunctionhasMediator(mediatorName:String):Boolean/判斷View的m

23、ediatorMap中是否有這個mediator實例3.3HYPERLINKlh00Controller類包:patterns.mvc類:publicclassController實現(xiàn):ControllerIControllerController負(fù)責(zé)保存Notice名稱與Command類的映射,執(zhí)行通知對應(yīng)的Command。3.3.1屬性/=只允許自己和子類訪問=protectedvarview:View;/對View單例的引用protectedvarcommandMap:Object;/存儲通知名稱與Command類的映射protectedstaticvarinstance:Control

24、ler;/Controller單例protectedconstSINGLETON_MSG:String=Controlleralreadyexist!;/消息常量3.3.2方法/=創(chuàng)建Controller=publicfunctionController()/Controller是單例,不能直接調(diào)用該構(gòu)造函數(shù),而應(yīng)調(diào)用單例工廠方法Controller.getInstance(),否則會拋出異常protectedfunctioninitController():void/自動被構(gòu)造函數(shù)調(diào)用,可由子類覆蓋,添加自定義內(nèi)容,而不覆蓋構(gòu)造函數(shù)。注意:若自定義View的子類,則也應(yīng)定義Controlle

25、r的子類,并override這個方法,象這樣:view=MyView.getInstance();publicstaticfunctiongetInstance():Controller/Controller的單例工廠方法/=操作Command=publicfunctionexecuteCommand(note:INotice):void/執(zhí)行note對應(yīng)的Command。首先根據(jù)note名稱,獲取command類,然后,創(chuàng)建command實例,執(zhí)行command業(yè)務(wù)邏輯。publicfunctionaddCommand(noteName:String,cmd:Class):void/把Com

26、mand類賦值給commandMap的屬性,屬性名為noteName。若某個noteName還沒Command,則先給note添加觀察者。若某個noteName已有Command,則用新command替換舊的。因為一個note,只能有一個處理者,否則就亂套了。publicfunctionhasCommand(noteName:String):Boolean/判斷noteName是否有對應(yīng)的CommandpublicfunctionremoveCommand(noteName:String):void/從Notice映射中移除注冊的Command。首先移除觀察者,再干掉command。4HYPE

27、RLINKlh00media包是一些中介人,它們是核心層與外界通信的代理人,是框架的配件(mvc是主體),可增減。我們的工作就是給這些配件添加自定義屬性和行為,來實現(xiàn)我們的需求。4.1HYPERLINKlh00Proxy類包:patterns.media類:publicclassProxy繼承:ProxyNotifier實現(xiàn):ProxyIProxy,INotifierProxy是Model的助理,負(fù)責(zé)保存數(shù)據(jù)對象,存取數(shù)據(jù),可發(fā)送通知。4.1.1屬性publicstaticvarNAME:String=Proxy;/Proxy名稱常量protectedvarproxyName:String;/

28、Proxy實例名稱protectedvardata:Object;/數(shù)據(jù)對象4.1.2方法/=訪問Proxy=publicfunctionProxy(proxyName:String=null,data:Object=null)/構(gòu)造函數(shù),保證proxyName有值,不保證datapublicfunctiongetProxyName():String/獲取Proxy名稱。在Model中,需要根據(jù)Proxy名稱來獲取Proxy實例/=訪問數(shù)據(jù)對象=publicfunctionsetData(data:Object):void/設(shè)定數(shù)據(jù)對象publicfunctiongetData():Objec

29、t/讀取數(shù)據(jù)對象/=生死關(guān)頭處理一下=publicfunctiononAdd():void/創(chuàng)建Proxy時publicfunctiononRemove():void/移除Proxy時4.2HYPERLINKlh01Mediator類包:patterns.media類:publicclassMediator繼承:MediatorNotifier實現(xiàn):MediatorIMediator,INotifierMediator是View的助理,負(fù)責(zé)保存視圖組件,操作具體的視圖組件,處理通知。4.2.1屬性publicstaticconstNAME:String=Mediator;/Mediator名稱

30、常量,通常,Mediator用于控制特定的一個或一組視圖組件,不需要動態(tài)命名protectedvarmediatorName:String;/Mediator實例名稱protectedvarviewComponent:Object;/保存視圖組件4.2.2方法/=訪問Mediator=publicfunctionMediator(mediatorName:String=null,viewComponent:Object=null)/構(gòu)造函數(shù),保證mediatorName有值,不保證viewComponent。也就是說,可以不指定視圖。publicfunctiongetMediatorName(

31、):String/獲取mediator名稱。在View中,需要根據(jù)mediator名稱來獲取mediator實例/=讀寫視圖組件=publicfunctionsetViewComponent(viewComponent:Object):void/設(shè)定mediator要處理的視圖組件publicfunctiongetViewComponent():Object/獲取mediator要處理的視圖組件/=處理Notice=publicfunctionlistNoticeInterests():Array/列出mediator關(guān)注的通知publicfunctionhandleNotice(notice

32、:INotice):void/收到通知進(jìn)行處理/=生死瞬間處理一下=publicfunctiononAdd():void/添加mediator實例時publicfunctiononRemove():void/移除mediator實例時4.3HYPERLINKlh01Command類包:patterns.media類:publicclassCommand繼承:CommandNotifier實現(xiàn):CommandICommand,INotifierCommand是Controller的助理,負(fù)責(zé)執(zhí)行單個業(yè)務(wù)邏輯處理通知。由用戶動作觸發(fā)一個通知,該通知由Command的execute方法來處理。4.3

33、.1屬性無4.3.2方法publicfunctionexecute(note:INotice):void/應(yīng)在子類中override該方法,添加自定義業(yè)務(wù)邏輯,處理通知。4.4HYPERLINKlh01Commands類包:patterns.media類:publicclassCommands繼承:CommandsNotifier實現(xiàn):CommandsICommand,INotifierCommands也是Controller的助理,負(fù)責(zé)執(zhí)行一系列Command處理通知。維護(hù)一個Command列表subCmds。execute時,Commands會按順序?qū)嵗痵ubCmds中的Command,

34、并調(diào)用其execute方法。4.4.1屬性privatevarsubCmds:Array;/Command列表,是個FIFO表4.4.2方法/=創(chuàng)建Commands=publicfunctionCommands()/在子類中,不必自定義構(gòu)造函數(shù),而是重寫initializeMacroCommand方法,若想自定義構(gòu)造函數(shù),必須調(diào)用superprotectedfunctioninitializeCmds():void/在子類中重寫該方法,給Command列表添加Command。注意:Command可以是Command或Commands。protectedfunctionaddSubCmd(cmd

35、Ref:Class):void/給Command列表添加Command/=執(zhí)行Commands=publicfinalfunctionexecute(note:INotification):void/執(zhí)行Command列表中的所有Command,禁止override該方法5HYPERLINKlh01observer包用于實現(xiàn)通知通信機制。不依賴Flash中的事件模型,而且AS3并沒有內(nèi)置的事件模型。采用觀察者模式,實現(xiàn)模塊之間的事件驅(qū)動通信。Flash事件和PureMVC通知的主要差異是:事件遵循“責(zé)任鏈”模式,在顯示層級中“冒泡”直到有父組件處理它;而通知遵循“發(fā)布/訂閱”模式。使用通知進(jìn)行

36、通信,PureMVC各模塊之間不需要建立父子關(guān)系。通知并不是事件的替代物。一般情況下,Mediator給其視圖組件添加事件偵聽器,按常用方式處理,然后給目標(biāo)Command廣播Notice,或與其他Mediator通信。Proxy通過廣播Notice,與Command實例和Mediator通信。5.1HYPERLINKlh01Observer類包:patterns.observer類:publicclassObserver實現(xiàn):ObserverIObserverObserver負(fù)責(zé)保存通知的處理者及其處理方法,收到通知則告知其處理者處理這個通知。5.1.1屬性privatevarprocessF:Function;/處理函數(shù)負(fù)責(zé)處理通知privatevarprocessO:Object;/處理者負(fù)責(zé)調(diào)用處理通知的方法5.1.2方法publicfunctionObserver(processFunc:Function,processor:Object)/構(gòu)造函數(shù),設(shè)定處理者和處理函數(shù)/=讀寫processFunc=publicfu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論