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
getName():String
getType():String
setBody(body:Object):void
setType(type:String):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
proxyName : String
主要 public 方法有:
//建構子
Proxy(proxyName:String = null, data:Object = null)
setData(data:Object):void
getData():Object
getProxyName():String
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() 這兩個方法來管理 NotificationhandleNotification(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
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):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 有一些認識
沒有留言:
張貼留言