2.Listener 监听器系统

GXT中的Listener采用观察者模式
因此在顶层就有一个接口com.extjs.gxt.ui.client.event.Observable,代表一个观察者
展示一下部分代码:
public interface Observable {

  public void addListener(EventType eventType, Listener<? extends BaseEvent> listener);

  public boolean fireEvent(EventType eventType, BaseEvent be);

  public List<Listener<? extends BaseEvent>> getListeners(EventType eventType);
  
  public boolean hasListeners();
  
  public boolean hasListeners(EventType eventType);

  public void removeListener(EventType eventType, Listener<? extends BaseEvent> listener);
}


BaseObservable 类对这个接口进行了实现
我们截取部分重要的代码来分析一下:
public class BaseObservable implements Observable {
  //是否开启事件触发,如果为false,则不处理所有的触发事件
  private boolean firesEvents = true;
  //此对象的所有监听器
  private Map<String, List<Listener<BaseEvent>>> listeners;
  //是否在事件触发状态
  private boolean activeEvent;
  //触发事件  特别注意此方法返回类型!
  public boolean fireEvent(EventType eventType, BaseEvent be) {
    if (firesEvents && listeners != null) {
      activeEvent = true;
      be.setType(eventType);

      List<Listener<BaseEvent>> list = listeners.get(getKey(eventType));
      if (list != null) {
        List<Listener<BaseEvent>> copy = new ArrayList<Listener<BaseEvent>>(list);
        for (Listener<BaseEvent> l : copy) {
          callListener(l, be);//① 此处可能会取消事件
        }
      }
      activeEvent = false;
      return !be.isCancelled();//② 返回类型表示是否需要取消事件
    }
    return true;
  }
}

fireEvent方法用来触发事件,判断自身的listeners是否有在监听eventType事件,如果有,则让该listener处理此事件.
在处理之前设置activeEvent=true,表示正在处理,处理结束后设置activeEvent=false,表示处理结束
当处理结束时返回的是:!be.isCancelled()
表示此事件是否需要取消。
为什么会有这个设计呢?
因为当listener①在处理这个事件时,它想要取消这个事件,中断后续的处理。那么他可以设置be.setCancelled(true);
此时返回的② !be.isCancelled() 为false
外部调用fireEvent方法的程序得到了一个false的返回值,就知道事件被取消了,不会继续调用下一步的处理。

你可能感兴趣的:(设计模式,UI)