模型一视图一控制器架构

这一篇是我在Model-View-Controller Architecture的中文翻译,网址在模型一视图一控制器架构
为了备份,并转贴在此:

ID 日期 2008/5/19
平台 所有可以用Java ME 的机种 测试机种 Nokia N95
类别 Java ME 子分类 架构
关键字(API、类别、方法、函式):org.puremvc.java, org.puremvc.java.demos.j2me.login

Contents

[hide]

序言

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架构来 建置较好结构且较易维护的应用程式。

内部连结