標籤雲

搜尋此網誌

2011/02/10

PureMVC 入門筆記-2

接著來看看 Notification

Notification

Package:org.puremvc.as3.patterns.observer
實作 INotification,與 Flash 的 Event 機制不同的是
Event 機制遵循的是 責任鍊(Chain of Responsibility) 模式,事件會跟著 displayObject 的 parent 一直上浮
而 Notification 則是遵照發布/訂閱模式,訂閱者只接收感興趣的消息,與接收者之間並無 parent/child 關係
而 Notification 並不是用來取代 Event 機制的,它們需要相互合作使用

主要 public 方法有:
//建構子
Notification(name:String, body:Object = null, type:String = null)

getBody():Object
getName():String
getType():String

setBody(body:Object):void
setType(type:String):void

toString():String

由於 Proxy, Mediator, Command 都繼承自 Notifier 並實作 INotifier
所以有一些共通的屬性方法
//連到 Facade 實體的參照
facade : IFacade
initializeNotifier(key:String):void
sendNotification(notificationName:String, body:Object = null, type:String = null):void
這些就不一一列在下面了
而要注意的是 Mediator/View 之間的關係不可避免的是緊耦合,Proxy/Data 也是一樣。但這樣可以讓他們與其他程式碼變成松耦合

Proxy

Package:org.puremvc.as3.patterns.proxy
繼承 Notifier,實作 INotifier, IProxy
Proxy 的角色是被 Model 註冊的數據持有者,並用來實現 Domain Logic,其中 data 可以透過 getter 轉型為它真正的型別

Protected 屬性:
data : Object
proxyName : String

主要 public 方法有:
//建構子
Proxy(proxyName:String = null, data:Object = null)

setData(data:Object):void
getData():Object
getProxyName():String

Mediator

Package:org.puremvc.as3.patterns.mediator
繼承 Notifier,實作 INotifier, IMediator
Mediator 的工作是負責讓 view component 與系統其他部分進行溝通,其中 viewComponent 可以透過 getter 轉型為它真正的型別

Protected 屬性:
mediatorName : String
//用來存放視覺組件的變數
viewComponent : Object

主要 public 方法有:
//建構子
Mediator(mediatorName:String = null, viewComponent:Object = null)

//在這邊列出要 Mediator 感興趣的 INotification 的名稱,這裡有列的,handleNotification()才會收到
listNotificationInterests():Array
//Mediator需要監聽 Flash 裡的 Event (來自 view Component),也要監聽 Notification,其差別就在於使用 listNotificationInterests() 跟 handleNotification() 這兩個方法來管理 Notification
handleNotification(notification:INotification):void
//handleNotification 範例 CODE
override public function handleNotification(notification:INotification):void{
 //建議使用 switch/case 來處理 Notification
 switch(notification.getName()){
  //這裡處理的 Notification 如果太多(超過四五個),應把 Mediator 拆開
  case LoginProxy.LOGIN_FAILED:
   //..省略...
   break;
  case LoginProxy.LOGIN_SUCCESS:
   //..省略...
   break;
 }
}

//viewComponent 的取得與設定
setViewComponent(viewComponent:Object):void
getViewComponent():Object

getMediatorName():String

至於 Command,則分成 SimpleCommand 跟 MacroCommand 兩種
差別在於 MacroCommand 可以執行其他 ICommand
Command 的功能在於協調 Proxy、處理異常等等

SimpleCommand

Package org.puremvc.as3.patterns.command
繼承 Notifier,實作 INotifier, ICommand

繼承自 Notifier 的屬性與方法
//連到 Facade 實體的參照
facade : IFacade
sendNotification(notificationName:String, body:Object = null, type:String = null):void

自己的方法只有一個,就是
execute(notification:INotification):void
這個方法是給我們 override 用的,可以把要處理的事情寫進去

MacroCommand
Package org.puremvc.as3.patterns.command
繼承 Notifier,實作 INotifier, ICommand

除了跟 SimpleCommand 一樣擁有
facade : IFacade
execute(notification:INotification):void
sendNotification(notificationName:String, body:Object = null, type:String = null):void
之外

還有以下方法:
initializeMacroCommand():void
addSubCommand(commandClassRef:Class):void

addSubCommand(commandClassRef:Class) 可以為 Command 增加 SubCommand
( SubCommand 本身可以是 SimpleCommand 也可以是 MacroCommand)
在 execute() 時會遵循 First In/First Out (FIFO) 的順序

要注意的是 execute() 在這裡已經變成一個 final function
所以要改為 override 它的 initializeMacroCommand() 方法
initializeMacroCommand()的 override 應該要像這樣:
override protected function initializeMacroCommand():void{
 addSubCommand(me.myapp.controller.FirstCommand);
 addSubCommand(me.myapp.controller.SecondCommand);
 addSubCommand(me.myapp.controller.ThirdCommand);
}

以上,已經把這四個重要的類別掃過一遍了
再搭配高手們的範例來看應該就會對 PureMVC 有一些認識

沒有留言: