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

 更新时间:2018年02月18日 10:06:50   作者:Jenkov  
这篇文章主要介绍了Java设计模式之监听器模式,结合实例形式较为详细的分析了java设计模式中监听器模式的概念、原理及相关实现与使用技巧,需要的朋友可以参考下

本文实例讲述了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程序设计有所帮助。

相关文章

  • Spring IOC容器FactoryBean工厂Bean实例

    Spring IOC容器FactoryBean工厂Bean实例

    这篇文章主要为大家介绍了Spring IOC容器FactoryBean工厂Bean实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • SpringBoot中condition注解的使用方式

    SpringBoot中condition注解的使用方式

    这篇文章主要介绍了SpringBoot中condition注解的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • java equals和==的区别详解

    java equals和==的区别详解

    这篇文章主要介绍了java equals和==的区别详解的相关资料,需要的朋友可以参考下
    2016-10-10
  • JavaSE-面向对象(方法重写)

    JavaSE-面向对象(方法重写)

    子类在调用父类的私有方法中不能直接调用,但是可以通过get方法进行调用,修改属性的值可以通过set方法进行修改。而子类想要修改父类中的方法可以使用方法重写进行操作。
    2021-08-08
  • java+selenium爬取图片签名的方法

    java+selenium爬取图片签名的方法

    这篇文章主要为大家详细介绍了java+selenium爬取图片签名的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 详解Spring中singleton bean如何同时服务多个请求

    详解Spring中singleton bean如何同时服务多个请求

    这篇文章主要介绍了详解Spring中singleton bean如何同时服务多个请求
    2023-02-02
  • java使用xstream实现xml文件和对象之间的相互转换

    java使用xstream实现xml文件和对象之间的相互转换

    xml是一个用途比较广泛的文件类型,在java里也自带解析xml的包,但是本文使用的是xstream来实现xml和对象之间的相互转换,xstream是一个第三方开源框架,使用起来比较方便,对java xml和对象转换相关知识感兴趣的朋友一起看看吧
    2023-09-09
  • java中Hibernate缓存形式总结

    java中Hibernate缓存形式总结

    在本篇文章里小编给大家整理的是一篇关于java中Hibernate缓存形式总结内容,有兴趣的朋友们可以参考下。
    2021-01-01
  • JAVA动态维度笛卡尔积输出的实现

    JAVA动态维度笛卡尔积输出的实现

    本文主要介绍了JAVA动态维度笛卡尔积输出的实现,通过动态生成笛卡尔积,可以方便地处理多维数据集,提高数据处理效率,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Java编程实现二项分布的采样或抽样实例代码

    Java编程实现二项分布的采样或抽样实例代码

    这篇文章主要介绍了Java编程实现二项分布的采样或抽样实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01

最新评论