为什么要设计这样的处理机制呢?
由于OOP编程将程序看成一个个对象、模块共同交流协作而提供功能或服务,这样必然会涉及对象之间交流消息的情况。所谓消息,就是指系统某处发生了什么事情,以信息的方式通知相关的对象。
AS3中采用的DOM3事件处理机制可以让交流数据的双方降低耦合度,及所谓的“脱耦”(脱离耦合性)!使得各个对象之间依赖性大大降低。
DOM3事件模型定义了一整套标准的生成和处理事件消息的方法,使程序中的对象可以相互交互、通信,保持自身状态和响应变化。
简单的说,数据的提供者只管发出数据对象,只要确保数据对象是flash.events.Event类或者子类的实例即可。
这种数据对象称为:事件(Event)。
数据对象的发出者称为:事件发送者(Event dispatcher)。
接受事件的对象称为:事件监听者(Event listener)。
DOM3事件的优点是:事件发送者和事件接收者的依赖性大大降低。
事件发送者只需要发送事件对象,
事件监听者只需要接受事件对象。
---------------------------------------------------------------------------------
下面用一个点菜的例子来深刻理解事件(Event)的原理!
当我们作为客人走进一家饭店时,就等于告诉服务生,我们要点菜,你来服务。当点菜时,我们只要报上需要的菜名,服务生自然会记录下我们点的菜单,并吩咐厨房。这个事件里就包含着DOM3的事件流程。
首先确定几个类,即:
客人类(Customer ),事件发送者(Event dispatcher)。
服务生类(Waiter ),事件监听者(Event listener)即事件侦听器。
点菜事件类(OrderEvent ),事件(Event)。
这些类都属于一个文档类SampleOrderDishes。
首先设计OrderEvent 事件类,这个事件应该包含事件的类型“点菜”,以及所点的菜名。
package
{
import flash.events.Event;
public class OrderEvent extends Event
{
public static const ORDER_DISHES: String = "点菜";
private var _dishes:Array;
private var _name:String;
public function OrderEvent()
{
super(ORDER_DISHES);
}
public function set nameCustomer(name:String):void
{
_name = name;
}
public function get nameCustomer():String
{
return _name;
}
public function set dishes(dishesAry:Array):void
{
_dishes = dishesAry;
}
public function get dishes():Array
{
return _dishes;
}
override public function toString():String
{
return formatToString("OrderEvent","type","bubbles","cancelable","eventPhase","dishes","name");
}
override public function clone():Event
{
var tmpEvt:OrderEvent = new OrderEvent();
tmpEvt._dishes = _dishes;
return tmpEvt;
}
}
}
接下来是客人类Customer,客人类中需要发出点菜OrderEvent事件。
package
{
import flash.events.EventDispatcher;
public class Customer extends EventDispatcher
{
private var name:String;
public function Customer(ns:String)
{
name = ns;
}
public function order():void
{
var orderDish:OrderEvent = new OrderEvent();
orderDish.dishes = ["宫保鸡丁","鱼香肉丝","咖喱牛肉"];
orderDish.nameCustomer = name;
dispatchEvent(orderDish); //发出点菜事件
}
}
}
服务生类Waiter类中需要有接受 OrderEvent 事件的公开方法,用来做 OrderEvent 事件的监听器。
package
{
public class Waiter
{
public function replayOrderFood(evt:OrderEvent):void
{
trace("你好,"+ evt.nameCustomer+"!你点的菜是:\r"+evt.dishes);
trace("我马上吩咐厨房去做。");
}
}
}
最终文档类SampleOrderDishes类
package {
import flash.display.Sprite;
public class SampleOrderDishes extends Sprite
{
public function SampleOrderDishes()
{
var luming:Customer = new Customer("Luming");
var serviceWaiter:Waiter = new Waiter();
luming.addEventListener(OrderEvent.ORDER_DISHES, serviceWaiter.replayOrderFood);
luming.order();
//luming这个人用order()方法点菜,在Order()方法中发出了OrderEvent事件,如Customer中所示
/*之后,被服务生serviceWaiter的replayOrderFood方法侦听到了,输出了
你好,luming!你点的菜是
宫保鸡丁,鱼香肉丝,咖喱牛肉
我马上吩咐厨房去做
*/
}
}
}
书中看到的例子觉得写的不错。拿来修改一下,并加入自己的分析。
如果想清楚整个流程建议debug走几遍,会对事件理解的更深刻。