由于ActionScript3.0是事件驱动的强交互性语言,所以模型-视图-控制器设计模式在ActionScript3.0当中也会与在其他语言中的定义有所不同。
-
数据模型是一个事件源(EventDispatcher)
-
视图是一个事件源(EventDispatcher)
-
控制器里面你有两个通道
1.一个通道监听视图的变化,并且把变化写入到模型
2.一个通道监听模型的变化,并且把变化输出到视图
如图3.2-2。
下面是这个模式的代码表述:
Model
package
{
import flash.events.EventDispatcher;public class Model extends EventDispatcher
{
}
}
Viewpackage
{
import flash.events.EventDispatcher;public class View extends EventDispatcher
{
}
}
Controllerpackage
{
public class Controller
{
private var v2mChannel:Channel;
private var m2vChannel:Channel;
public function Controller(view:View, model:Model) {
this.v2mChannel = new ViewToModelChannel(view, model);
this.m2vChannel = new ModelToViewChannel(view, model);
}
}
}class Channel {
protected var view:View;
protected var model:Model;
public function Channel(view:View, model:Model) {
this.view = view;
this.model = model;
}
}class ViewToModelChannel extends Channel {
public function ViewToModelChannel(view:View, model:Model) {
super(view, model);
//监听来自视图的事件
this.view.addEventListener(……..
}
}class ModelToViewChannel extends Channel {
public function ModelToViewChannel(view:View, model:Model) {
super(view, model);
//监听来自模型的事件
this.model.addEventListener(…….
}
}
下面,我们用一个简单的例子来介绍这个设计模式如何使用。在后面的章节当中,我们会大量使用这里所介绍的模型-视图-控制器设计模式。
如图3.2-5和3.2-6,这个程序有一个输出框架和一个输入框架。在输入框架增加或者减少模型的顶点,输出框架根据模型当中的顶点数绘制正多边形。
(图3.2-5)
(图3.2-6)
在这个例子当中,模型定义了一个vectorChanged事件(VECTOR_CHANGED)和一个正整数(vectors)。定义了两个公开的方法来操纵这个正整数(getVectors、setVectors)。如图3.2-7。
(图3.2-7)
模型对于外面发生的事情一无所知,它只知道在vectors改变的时候发布vectorChanged事件(VECTOR_CHANGED)。
笔记:
一个对象是由数据和方法所构成的,数据定义的是对象的状态,所以有的时候,数据又被叫做属性,比如例子当中的Model,数据域vectors表示这个Model目前是处在3个顶点的状态,或者是4个顶点的状态。
我们要强调的是对象当中的方法。对象当中的方法是对本对象自身的数据的操作。所以方法(Method)有时候又被叫做操作(Operation)。