使用PureMVC需要注意的九個地方

1.用(Pure)MVC的思想去思考

我應該如何開始使用(Pure)MVC呢? 一句話:用(Pure)MVC的思想去思考! 從它的名字中就可以看出, PureMVC 是基於一般的 Model-View-Controller 元設計模式的.使用Facade-pattern 這種模式你不需要直接初始化一個核心行爲(instantiate the core actors), 但是PureMVC中的每個Class都有它自己的定義很清楚的角色:
- Proxies = Model
- Mediator and its ViewComponents = View 
- Commands = Controller

2.爲View Components創建API

一個 View Component可能是一個標準的UI component (比如DataGrid) 或者自定義組件 (比如一個遊戲世界) 或者其他的東西. 不要直接使用它的 public方法. 而是把改變它的狀態或者行爲(等允許被外部調用的各種方法屬性)寫成API.

PureMVC的一個有點就是可以與所使用的技術無關. 舉個例子:我建了一個基於PureMVC的'Pure' Flash application ,沒有用到Flex Framework. 而後,爲了使用AIR裏面的File System API這個Application被轉成一個AIR application.這時只需將View Components轉化爲使用 Flex Framework即可, 其他的Mediators 或者任何PureMVC中的任何actors均不需改變 .

3.多個View Components共同使用一個Mediator

爲了緊密協調多個View Components 僅使用一個Mediator. 換句話說: 不是所有的Views 都需要Mediator. 例如: 有一個ApplicationControlBar,其中包含一個TextInput ,一個Button 或者其他的組件. 然後爲ApplicationControlBar 創建一個名爲ApplicationControlBarMediator的 Mediator 並且把它指定給ApplicationControlBar中所包含的所有View Component.

4.讓Events bubble up起來

如果你不想在一個Mediator中用多個View Components 又會怎樣呢?爲了處理多個 View Components的用戶交互事件, 我們必須把View Component裏面嵌套的所有組件的事件bubble up起來.

例如: 當你點擊View Component 裏面的任意Button都會觸發Mediator監聽的一個自定義事件. 所以Mediator並不需要知道這個Button是否存在或者任何一個這個 View Component的其他Child,它只需要知道這個事件已經被觸發了就可以.

5.儘可能地的用Notifications通信

Notifications是PureMVC 裏面的“Events” . 當Model, View and Controller 三者之間的通信是下面幾種情況時應該儘可能地的使用這個Notifications :
(通信 from -> to) 
- Mediator -> Proxy (via mapped Commands) 
- Proxy -> Mediator 
- Proxy -> Command 
- Commands -> Mediator

即使可以從Mediator獲得Proxy,也不要直接用Mediator來改變Proxy.應該是用一個mapped Command來發送Notification. 不通過使用Command (Controller)而用Mediator (View)來直接改變 Proxy (Model) 是一種非常糟糕的方法.

6.儘可能多的使用 Commands / MacroCommands

Commands在控制端做這些工作: Retrieving and interacting Proxies, 與Mediators通信或者執行其他Commands. 即使一個Command僅被用了一次或者只有兩行代碼也要儘可能多的使用它. 爲了在你的Application中可以隨時隨地的再次執行一個Command ,僅需發送一個Notification.以後也可以很容易的用更復雜的actions來擴展這個 Command. 還有非常重要的一點就是你總是知道改變Proxy (Model)的actor是哪一個.

問題: 你也沒有遇到過需要按照特定次序執行多個Command的情況呢? 使用MacroCommands可以順序執行多個SubCommands (也就是 “簡單” Commands) .

7.使用Remote Proxy來接收和發送服務端數據

在Application中的發送和接收數據的Proxies 叫做“Remote Proxies”. 它不是一種特殊的PureMVC Proxy, 只是一個基於Proxy的location,而這個Proxy是負責處理比如HTTPSerivice,RemoteObject或者其他服務端調用的Proxy.

例如: 爲了調用服務器端一個負責登錄用戶的RemoteObject 而創建了一個叫做LoginProxy的Proxy. LoginProxy負責所有與服務器端通信的工作, 也就是接收和發送數據. 當你爲LoginProcess改變服務器端執行操作時,你值需要改變Application中的一個locationt即可,即 LoginProxy.

8.去掉沒有用到的Mediators

在某些情況下你不再使用一個Mediator和它的View Components. 你應該用facade.removeMediator(MyMediator.NAME)去掉這個Mediator同時用 destroy()來去掉包含所有listeners,timer,references的ViewComponent.以便更好的進行 垃圾回收.

9.VO's (Value Objects)的魅力所在

當然在Model中存放數據的是Proxies. 而且View Components不需要知道Facade和這個PureMVC application的其他部分. 這就意味着View Component不會直接訪問Model的數據.

爲了避免在View Component中存放數據可以使用一個 名爲Value Objects (VO’s)的引用 . VO's並不是PureMVC裏面的核心actor,它和Flex裏面的Data Binding有點淵源,是一個可以在不打破規則的情況下改變Model的數據的非常強大的方法..

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章