模型一視圖一控制器架構

這一篇是我在Model-View-Controller Architecture的中文翻譯,網址在模型一視圖一控制器架構
為了備份,並轉貼在此:

ID 日期 2008/5/19
平台 所有可以用Java ME 的機種 測試機種 Nokia N95
類別 Java ME 子分類 架構
關鍵字(API、類別、方法、函式):org.puremvc.java, org.puremvc.java.demos.j2me.login

序言

MVC (模型-視圖-控制器)模式是軟體工程的一種建築模式,這個模式允許程式設計師將UI(表現層)、應用資料及業務邏輯分離來使更容易維護程式碼及適應變化。

  • 模型 – 模型一種資料的表現特別使用在應用程式中。
  • 視圖 – 應用程式的UI,它表示模型顯示或與其交互作用。
  • 控制器 – 處理來自使用者互動的事件以及調用模型上的改變。

PureMVC

PureMVC是免費的開放原始碼,它是以模型-視圖-控制器模式為基礎來建立應用程式的輕量級架構,它被移植到很多語言包括Java,因此可以被實作到Java ME應用程式中,拜訪http://www.puremvc.org 來學習有關該架構、最佳地實務練習以及下載最新版本,PureMVC也有Python語言的版本。

使用有Java ME的PureMVC

PureMVC使用良好結構方式來建構應用程式的基礎,這樣可以使程式設計師容易地移植他們正在建構到許多設備及平台上的應用程式,它也使得應用程式容易維護、展開及改變專案。

下載登錄應用程式

這個範例可以作為任何的Java手機專案的基礎,目前這個應用程式使用puremvc Java port的0.2版,這裡有一個快速瀏覽一些架構如何使用這個登入demo,要想完全瞭解puremvc訪問該網站然後研讀文件說明,這個範例雖然用 Actionscript 3寫成但理論上可以用到所有支援的語言。

puremvc架構有四個工作項目。

  • Model模型
  • View視圖
  • Controller控制器
  • Facade外觀

所有應用程式由ApplicationFacade開始,他是這個架構的通訊中心。

private ApplicationFacade facade = ApplicationFacade.getInst();
...
    protected void startApp()throws MIDletStateChangeException
    {
		this.facade.startup(this);
    }
...

ApplicationFacade.java

package org.puremvc.java.demos.j2me.login;
import org.puremvc.java.patterns.facade.Facade;
import org.puremvc.java.patterns.observer.Notification;
import org.puremvc.java.demos.j2me.login.controller.StartupCommand;
import org.puremvc.java.demos.j2me.login.controller.ProcessLogin;
import org.puremvc.java.demos.j2me.login.LoginExample;
public class ApplicationFacade extends Facade
{
	public static final String STARTUP = "startup";
	public static final String LOGIN = "login";
	public static final String SUBMIT_LOGIN = "submitLogin";
	public static final String LOGIN_SUCCESSFUL = "loginSuccessful";
	public static final String LOGIN_FAIL = "loginFail";
	public static final String MAIN = "main";

	//Startup command notifications
    	public static final String PREP_MODEL = "prepModel";
    	public static final String PREP_VIEW = "prepView";

	private static ApplicationFacade instance = null;

	public static LoginExample midlet;

	public static ApplicationFacade getInst()
	{
		if(instance == null)
		{
			instance = new ApplicationFacade();
		}

		return instance;
	}

	protected void initializeController()
	{
		super.initializeController();

		registerCommand(STARTUP, StartupCommand.class);
		registerCommand(SUBMIT_LOGIN, ProcessLogin.class);
	}

	public void startup(LoginExample midlet)
	{
		this.midlet = midlet;
		notifyObservers(new Notification(STARTUP, null, null));
	}
}

架構間的通訊透過commands、mediators及proxies的註冊來運作。

ApplicationFacade.java

registerCommand(SUBMIT_LOGIN, ProcessLogin.class);

PrepViewCommand.java

this.facade.registerMediator(new LoginScreenMediator());

PrepModelCommand.java

this.facade.registerProxy(new ItemDataProxy());

每一個UI螢幕都有一個mediator附加在上面,mediator讓UI及架構可以互相作用。 Mediators藉由註冊跟呼叫有關的一個通知來回應呼叫並且透過handleNotification方法來處理任何呼叫。

LoginScreenMediator.java

public String[] listNotificationInterests()
{
	return new String[] {ApplicationFacade.LOGIN, ApplicationFacade.LOGIN_FAIL};
}

public void handleNotification(INotification note) 
//Variables can be passed along through INotification note.
{
	if(note.getName().equals(ApplicationFacade.LOGIN))
	{
		ApplicationFacade.midlet.fetchDisplay().setCurrent(getLoginScreen());
	}
	else if(note.getName().equals(ApplicationFacade.LOGIN_FAIL))
	{
		getLoginScreen().loginFail();

	}
}

Mediators也可以使用facade.notifyObservers產生一個呼叫到架構裡。

...
 this.facade.notifyObservers(new Notification(ApplicationFacade.SUBMIT_LOGIN, details,
 null));

注意:details是一個字串陣列,任何變數可以透過通知來傳遞

控制會監聽其註冊的呼叫。

registerCommand(SUBMIT_LOGIN, ProcessLogin.class);

資料可以使用一個Value的物件來儲存(ItemDataVO.java)然後透過proxy(ItemDataProxy.java)來存取

Value物件用下列方式產生然後加到一個proxy。

ProcessLogin.java

//Add some ItemDataVO objects using proxy
ItemDataProxy itemProxy = (ItemDataProxy)facade.retrieveProxy(ItemDataProxy.NAME);
for(int i=0; i<url.length;i++)
{
	ItemDataVO item = new ItemDataVO(url[i], data[i]);
	itemProxy.addItem(item);
}

再一次說明這是puremvc架構唯一概述,訪問http://www.puremvc.org 然後閱讀文件來完整瞭解架構的使用,另外也研究所附的登錄demo程式,登錄Demo是免費提供你使用、改變及建置的,請貢獻你用Java ME在使用這個架構時所發現任何好的及新的方式來幫助PureMVC社群,你也可以提供更多demo及教學來幫助,我希望你樂於使用PureMVC架構來 建置較好結構且較易維護的應用程式。

內部連結

Print Friendly, PDF & Email

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料