Flex事件处理机制(转载)

为什么要设计这样的处理机制呢?

由于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走几遍,会对事件理解的更深刻。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值