博客
关于我
观察者模式、监听器以及Spring中的监听器
阅读量:661 次
发布时间:2019-03-15

本文共 1933 字,大约阅读时间需要 6 分钟。

观察者模式与Spring事件监听机制的深度比较

在软件开发中,确保系统各组件之间的良好通信是设计中的关键环节。观察者模式和 listening pattern(以下简称 "监听器模式")是解决这一问题的两大不同设计模式。尽管两者在底层机制上存在差异,但是理解其异同点对于选择合适的解决方案至关重要。本文将从概念到实践,全面探讨这两种模式的应用场景及其在Spring框架中的表现。

观察者模式

观察者模式(Observer Pattern)是一种设计模式,核心思想是被观察者(subject)与多个观察者(observer)之间建立动态的关系。一旦被观察者发生特定行为,会自动通知所有关注的观察者,让它们做出相应的响应。

角色角色分工
  • 抽象观察者 (IObserver):定义了观察者对被观察者行为的响应方式。
  • 抽象被观察者 (ISubject):维护观察者队列,并通知所有观察者。
  • 具体观察者 (ConcreteObserver):实现了抽象观察者接口,对具体事件做出响应。
  • 具体被观察者 (ConcreteSubject):实现了抽象被观察者的方法,完成具体业务并通知所有观察者。
实现机制
  • 对于一个典型的.get().work()流程,具体被观察者将在自身业务完成后调用notifyObervers()方法。
  • 具体被观察者的 notifyObervers() 方法会遍历观察者队列,将每个观察者的 action() 方法叫醒。
  • 观察者可以通过自己的注册方法 (@register) 将自身添加到被观察者的队列中。
  • 应用案例

    为简化理解,我们可以用一个Twitter-like的例子:“用户发布微博”——用户是被观察者,关注的是其他用户发布的微博内容,微博发布是被观察者的行为。

    监听器模式

    listening pattern("监听器模式")虽然在概念上与观察者模式类似,但其背后的机制有所不同。观察者模式与 listening pattern 的主要区别是事件传递的内容:观察者模式传递行为, listening pattern 传递行为+事件实例。

    角色角色分工
    • 事件源 (Event Source):生成事件实例。
    • 事件对象 (Event):包含事件类型和事件源信息。
    • 事件监听器 (Listener):定义对特定事件的响应方式。
    实现机制
  • 事件源触发特定方法(如sendNotification())发布事件。
  • 事件对象保留事件类型和源信息,便于监听器分析处理。
  • 每个事件类型可能对应不同的队列,缩小事件监听的粒度。
  • 与观察者模式的区别
    • 事件对象传递:在观察者模式中,传递的是行为,而非行为+事件实例。
    • 响应灵活性:在 listening pattern 中,监听器可以根据事件类型自行决定如何处理,没有强制性约束。

    观察者模式与 listening pattern 的关系

    两种模式在运行机制上有直接的关联:观察者模式可被视为 listening pattern 的一种特例,只是不传递事件对象。

    Spring中的事件监听机制

    在Spring框架中,应用 ProgramaticListener 和 lắng leser模式结合使用,提供更灵活的事件管理机制。

    • ApplicationEvent:定义了基本的事件类,继承自Spring提供的EventObject。
    • ApplicationListener:定义了对事件做出的响应方式,通常通过接口定义。
    • ApplicationContext:作为事件发布者的核心接口,提供事件发布和处理的基础支持。
    事件监听的实现方式
  • 注解方式
    @componentpublic class MyAnnotationListener implements ApplicationListenercuritiesevent> {    @EventListener    public void handle(SecuritiesEvent event) {        // 自定义处理逻辑    }}
  • 手动注册方式
    appContext.addListener(new MyListener() {    @Override    public void onApplicationEvent(ApplicationEvent event) {        // 定义的事件响应逻辑    }});
  • 常见问题与优化

    在实际应用中,一个常见的难点是如何管理 listener 的生命周期和依赖注入。例如,当使用非Spring管理的 listener 实例进行操作时,需要特别注意ServletContextリス

    转载地址:http://xabqz.baihongyu.com/

    你可能感兴趣的文章
    .Net中webBrowser控件指定IE版本
    查看>>
    0-1背包问题:贪心算法与动态规划的比较
    查看>>
    C++ switch混淆
    查看>>
    02-docker系列-镜像分类以及操作(导入、导出、删除)
    查看>>
    02-Docker镜像分类及操作秘籍,轻松掌握导出、导入、删除
    查看>>
    03-docker容器的基本操作
    查看>>
    03-docker系列-docker容器的基本操作
    查看>>
    04-docker-commit构建自定义镜像
    查看>>
    04-docker系列-commit构建自定义镜像
    查看>>
    05-docker系列-使用dockerfile构建镜像
    查看>>
    05-如何通过Dockerfile实现高效的应用容器化?
    查看>>
    06-docker系列-使用dockerfile构建nginx、redis镜像
    查看>>
    06-使用dockerfile构建nginx、redis镜像
    查看>>
    07-docker系列-使用dockerfile构建python、jenkins镜像
    查看>>
    07-使用dockerfile构建python、jenkins镜像
    查看>>
    08-docker系列-docker网络你了解多少(上)
    查看>>
    09-docker系列-docker网络你了解多少(下)
    查看>>
    1 解决XP重装后原文件夹拒绝访问
    查看>>
    10-docker系列-docker文件共享和特权模式
    查看>>
    #AMBA##AHB总线学习
    查看>>