標籤雲

搜尋此網誌

2011/02/10

PureMVC 入門筆記-1

雖然已經有很多先進寫過關於 PureMVC 的相關文章
但是我還是習慣自己整理一下筆記來釐清觀念

PureMVC 的目的就是實踐 MVC 設計模式,把程式分成Model、View、Controller 三個部份,當然裡面還實作了 GoF 設計模式:可復用物件導向軟體的基礎裡面的其他設計模式(代理模式, 命令模式, 觀察者模式, 外觀模式, 單例模式, 工廠方法模式, 中介者模式...等)

Model (負責轉發請求,對請求進行處理) --> Proxy
View (使用者介面) --> Mediator
Controller(資料管理或實作演算法) --> Command
Facade (實做外觀模式,使用單一類別作為MVC三者溝通之用)

而溝通則使用 Notification (實做觀查者模式),不使用 Flash 的 Event 機制,以便移植到其他語言
Notification 可以被用來觸發 Command 的執行
Facade, Proxy, Mediator, Command 大家都可以 sendNotification
而 Facade 跟 Proxy 不會接收 Notification

以下針對個別部份進行詳細說明:( Standard 版本)
Facade

Package:org.puremvc.as3.patterns.facade
是 IFacade 的單例實作
Facade 的功能有:
初始化 Model, View, Controller 的單例類別並提供所有方法
對主程式註冊 Command 的地方

主要 public 方法有:
getInstance():IFacade

//建立並發送 INotification.
sendNotification(notificationName:String, body:Object = null, type:String = null):void
//取得 Mediator
retrieveMediator(mediatorName:String):IMediator
//取得 Proxy
retrieveProxy(proxyName:String):IProxy

//註冊 Command, Mediator, Proxy
registerCommand(notificationName:String, commandClassRef:Class):void
registerMediator(mediator:IMediator):void
registerProxy(proxy:IProxy):void

//移除 Command, Mediator, Proxy
removeCommand(notificationName:String):void
removeMediator(mediatorName:String):IMediator
removeProxy(proxyName:String):IProxy

//檢查 Command, Mediator, Proxy 是否已註冊
hasCommand(notificationName:String):Boolean
hasMediator(mediatorName:String):Boolean
hasProxy(proxyName:String):Boolean

Protected 屬性及方法有:
instance : IFacade [static]
model : IModel
view : IView
controller : IController
//初始化的方法
initializeFacade():void
initializeModel():void
initializeView():void
initializeController():void

Facade 的範例 ApplicationFacade.as:
package com.me.myapp{
//import
import com.me.myapp.view.*;
import com.me.myapp.model.*;
import com.me.myapp.controller.*;

import org.puremvc.as3.interfaces.*;
import org.puremvc.as3..patterns.facade.*;

// 繼承 Façade, 實作 IFacade
public class ApplicationFacade extends Façade implements IFacade{
 // 為 Notification 定義常數
 public static const STARTUP:String = "startup";
 public static const LOGIN:String = "login";
 // 用以取得單一實體的工廠方法
 public static function getInstance() : ApplicationFacade{
  if ( instance == null ) instance = new ApplicationFacade();
  return instance as ApplicationFacade;
 }
 // 初始化 Controller,註冊 Command (建立 Notification 與 Command 的對應關係)
 override protected function initializeController( ):void{
  super.initializeController();
  registerCommand( STARTUP, StartupCommand );
  registerCommand( LOGIN, LoginCommand );
  registerCommand( LoginProxy.LOGIN_SUCCESS, GetPrefsCommand );
 }
 /** 建立一個 startup 方法把應用程式作為參數傳入
  * 並發出 Notification 將它送到已註冊的 StartupCommand
  */
 public function startup( app:MyApp ):void{
  sendNotification( STARTUP, app );
 }
}
}

整理到這邊好像篇幅差不多了
下一篇繼續來看 Proxy, Mediator, Command, 還有 Notification

沒有留言: