当前位置: 移动技术网 > IT编程>开发语言>Java > Java设计模式之监听器模式实例详解

Java设计模式之监听器模式实例详解

2019年07月19日  | 移动技术网IT编程  | 我要评论

本文实例讲述了java设计模式之监听器模式。分享给大家供大家参考,具体如下:

监听器模式有三个要素——事件源、事件对象、监听器。

事件源:顾名思义,事件发生的源头,比如点击的按钮,属于被监听的对象;
事件对象:这个经常和事件源混淆,它经常被用来包装事件源,切记,它毕竟是个事件,比如点击事件,和事件源的区别自己感受,木有栗子;
监听器:这个是监听器模式的核心,定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参。

下面举个简单的栗子:

故事背景是,小明是个不讲卫生的孩子,他妈妈很担心他的健康,规定必须饭前洗手。

定义一个熊孩子。熊孩子就是被监听的对象,是事件源,一切事件都是事件源发出,这似乎是句废话。

public class child {
  private string name;
  private remindlistener remindlistener;
  public child(string name){
    this.name = name;
  }
  public void eat() {
    if(null!=remindlistener){
      remindlistener.remind(new remindwashinghandsevent(this));
    }
    system.out.println("child eat...");
  }
  public void addlistener(remindlistener listener){
    remindlistener = listener;
  }
}

接下来是看看事件对象,事件对象正如上面所述,包装了事件源。我们在这里定义一个饭前洗手事件。

public class remindwashinghandsevent {
  private child child;
  public remindwashinghandsevent(child child){
    this.child = child;
  }
}

事件对象定义了事件的属性、状态。
紧接着是定义事件发生后,监听器的动作,在这里是提醒洗手。

public class remindlistener {
  public void remind(remindwashinghandsevent remindwashinghandsevent){
    system.out.println("listen to mom, washing hands before eating...");
  }
}

注意,监听器主要封装了动作,仅此而已。

以上代码,只是为了说明监听器模式原理,代码通俗,不太优雅。

下面继承或实现java标准库,又随手写了一对代码,夜深了,有时间再解释。

public class kid{
  private string name;
  private list<listener> liteners;
  public kid(string name) {
    this.name = name;
    this.liteners = lists.newarraylist();
  }
  public void eat(){
    for(listener listener:liteners){
      if(listener instanceof washinghandslistener){
        washinghandslistener washinghandslistener = (washinghandslistener) listener;
        washinghandslistener.fireaftereventinvoked(new washinghandsevent(this,"洗手"));
      }
    }
    system.out.println("吃饭...");
  }
  public void addlistener(listener listener){
    liteners.add(listener);
  }
}
public class event extends eventobject {
  /**
   * constructs a prototypical event.
   *
   * @param source the object on which the event initially occurred.
   * @throws illegalargumentexception if source is null.
   */
  public event(object source) {
    super(source);
  }
}
public class washinghandsevent extends event{
  private string eventname;
  /**
   * constructs a prototypical event.
   *
   * @param source the object on which the event initially occurred.
   * @throws illegalargumentexception if source is null.
   */
  public washinghandsevent(object source,string eventname) {
    super(source);
    this.eventname = eventname;
  }
  public string geteventname() {
    return eventname;
  }
  public void seteventname(string eventname) {
    this.eventname = eventname;
  }
}
public interface listener extends java.util.eventlistener{
  public void fireaftereventinvoked(event event);
}
public class washinghandslistener implements listener{
  @override
  public void fireaftereventinvoked(event event) {
    washinghandsevent washinghandsevent = (washinghandsevent) event;
    system.out.println("饭前准备"+ washinghandsevent.geteventname());
  }
}
public class test {
  public static void main(string[] args) {
    kid xiaoming = new kid("xiaoming");
    xiaoming.addlistener(new washinghandslistener());
    xiaoming.eat();
  }
}

输出结果:

更多java相关内容感兴趣的读者可查看本站专题:《java数据结构与算法教程》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网