Java监听器模式在实际中的应用

监听器模式是一种行为型设计模式,它允许对象之间通过监听和触发事件的方式实现解耦,提高代码的灵活性和可维护性。在监听器模式中,存在两类角色:事件源(Event Source)和监听器(Listener)。事件源负责产生事件,而监听器负责监听事件的发生并采取相应的行动。当事件源触发事件时,所有注册了对应类型监听器的对象都会得到通知,然后执行相应的操作。
监听器模式在Java开发中被广泛应用。在Java中,监听器模式通常通过定义接口和实现类来实现。例如,在Web应用中,监听器可以用于记录网站的刷新量,或者在服务器关闭时将数据保存到文件或数据库中。在JavaEE框架中,监听器也用于监听HttpSession的创建和销毁,以记录当前所有在线人数。
另外,监听器模式也存在于网络安全领域,特别是无线网络的安全。监听器模式或RFMON(射频监视器)模式允许具有无线网络接口控制器的计算机监视从无线网络接收到的所有流量,而无需首先与接入点或ad hoc网络相关联。这是802.11无线网卡可以运行的模式之一,为网络安全提供了重要支持。

步骤

1.定义事件源:事件源是触发事件的对象。它应该提供注册监听器和触发事件的方法。注册监听器的方法通常接受实现了监听器接口的对象作为参数,并将其添加到一个监听器列表中。触发事件的方法则遍历监听器列表,调用每个监听器的相应方法。
2.定义监听器接口【非必要,看需求】:监听器接口定义了当事件发生时应该执行的操作。通常,这个接口会包含一个或多个方法,这些方法将在事件发生时由事件源调用。
3.实现监听器【非必要,看需求】:你需要创建一个类来实现监听器接口,并在其中实现相应的方法。这些方法定义了当事件发生时应该执行的具体操作。
4.注册监听器:在你的代码中,你需要创建一个或多个监听器对象,并使用事件源提供的注册方法将它们注册到事件源上。
5.触发事件:当特定的事件发生时(例如,用户点击了一个按钮,或者某个数据发生了变化),事件源将遍历其监听器列表,并调用每个监听器的相应方法。

具体实现

  1. 创建一个实体类
import lombok.Data;

@Data
public class DemoData {
    private Long id;

    private int code;

    private String msg;
}

  1. 定义事件源
import org.springframework.context.ApplicationEvent;
public class DemoDataEvent extends ApplicationEvent {
    private DemoData demoData;
    /**
     * Create a new {@code ApplicationEvent}.
     *
     * @param source the object on which the event initially occurred or with
     * which the event is associated (never {@code null})
     */
    public DemoDataEvent(DemoData source) {
        super(source);
        this.demoData = source;
    }

    public DemoData getData() {
        return this.demoData;
    }
}
  1. 注册监听器
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class DemoDataEventListener implements ApplicationListener<DemoDataEvent> {

    // 注册消息队列
    // ...
    
    @Override
    public void onApplicationEvent(DemoDataEvent event) {
        if (event != null) {
            // 需要重新封装再此处填充
            sendData(event);
        }
    }

    private void sendData(DemoDataEvent event) {
        // 写入消息队列
        // ...
        // 或者执行对应的任务
    }

}
  1. 触发事件
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;

@Component
public class DemoDataEventPublisher implements ApplicationEventPublisherAware {

    private ApplicationEventPublisher publisher;
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.publisher = applicationEventPublisher;
    }

    public void publish(DemoData demoData) {
        DemoDataEvent demoDataEvent = new DemoDataEvent(demoData);
        publisher.publishEvent(demoDataEvent);
    }
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值