下面简单说下观察者模式是个什么。所谓“观察者”,就是观众,围观群众。但只有围观群众还构不成观察者模式,还需要有“被观察者”。观察者模式由“被观察者”和“观察者”共同构成。一个“被观察者”可能会有0到n个“观察者”。
在我们社区中“被观察者”可以是“博客”、“用户”、“组件设计”、“讨论”、“留言”等等。“观察者”则是“积分”、“动态”、“邮件”、“站内信”、“短信”等等。举个例子:当用户发表一篇博客,各个关注者将会被通知,积分系统得知后会给用户做加分,动态系统会增加动态信息,其他系统也会根据自己的需要做一些处理。
其实观察者模式与java中的事件机制是非常相似的。当事件发生时,所有的监听器将会得到事件的信息,做自己分内的工作。所以“被观察者”我们可以认为是事件源EventSource,“观察者”就是监听器Listener。一个事件源可以有多个动作叫做Action,事件源发起动作称之为事件Event。
当事件源EventSource发生一个动作Action时,产生一个事件Event。所有的关注者Listener将的到这个Event,并根据Event中的信息,来完成自己要做的事情。这就是整个事件机制也就是观察者模式的大体过程。
在实际的程序中,我们可能会有几个点需要解决一下。一个是,动作发生时,如何产生一个事件?另一个是,监听器如何关注事件并被通知到?对于第一个问题,我们只需要一个点火装置在动作发生时fire一下。解决第二个问题,我们需要一个可以容纳足够“观察者”的容器,就好像观看演出的剧场观众席。当事件发生时,依次通知这些“观察者”。
那么整体的结构应该是这样的:
通常情况下,监听机制有这些东西就可以建立了。具体的监听器,只要实现Listener接口,然后添加到事件源中就可以对事件源所发生的事件进行观察了。不过我觉得可能这样看起来不是很舒服,因为写程序时,我们应该尽可能让业务服务中少一些不相干的东西。比如上面EventSource里的listeners和一些fireEvent这样的方法。所以改造一下成下面这种形式,可以让程序看起来干净一些。
另外获得一个好处:经过这一步改造后,事件源与“事件类”、“监听器类”隔绝了,我们在系统中使用这种机制变得更加方便了。
在实际的社区应用中事件机制就是基于这种关系组织建立起来的。为了更加便于开发和扩展,在应用时又做了一些扩充。
由于社区中需要关注的事件并不是很多,一个事件管理器已经足够使用,我们可以采用使用同一套管理器管理多类事件并分发给相关监听者的方式。
采用这种方式,首先要区分出事件的来源是什么,以便发生事件时通知相关的监听器。因此,增加了一个事件来源标识的枚举,为了区分事件来源,是博客、微博、讨论还是其他什么。
总体结构如下图:
(PS:附件里是我测试的代码,有兴趣的朋友可以看一下。看这部分内容的时候,建议对照java源码中Swing中的处理。)
图片弄不过来,看一下原文。 http://www.360doc.com/content/13/0926/19/14033216_317287125.shtml
相关推荐
### 事件驱动模型实例详解(Java篇) #### 1. 事件驱动模型概念解析 事件驱动模型是现代软件开发中一种关键的编程模式,尤其在图形用户界面(GUI)编程中占据核心地位。该模型围绕三个核心概念构建:事件源、侦听...
在Java开发领域,事件驱动模型(Event-Driven Model)是一种广泛采用的设计模式,它通过响应外部事件来触发程序中的特定行为。本文将深入探讨Java中事件驱动模型的应用,特别是通过Swing框架的具体实例来解析这一...
Spring框架是Java开发中广泛应用的一个开源框架,它提供了一种事件驱动模型来增强应用程序的组件之间的通信。在本文中,我们将深入探讨Spring事件驱动模型,理解其工作原理,并通过源码分析来深化认识。 首先,...
论文研究-城市轨道交通车站客流仿真中的事件驱动模型.pdf, 利用多智能体(Multi-agent)仿真技术对轨道交通车站设计方案、客流组织方案进行评估是一种科学有效的方法.在对...
【并发编程-事件驱动模型1】 并发编程是现代软件开发中的关键组成部分,它允许程序同时处理多个任务,提高系统的效率和响应性。事件驱动模型是一种常见的并发编程模型,尤其适用于网络服务器和用户界面(UI)应用...
在Spring框架中,事件驱动模型主要由三部分组成:事件(Event)、事件监听器(EventListener)和事件发布者(EventPublisher)。当某个组件发生特定事件时,它会创建一个事件对象并将其发布给感兴趣的监听器,这些...
Netty框架之异步事件驱动模型
为了解决这一问题,作者提出了采用ACE(Adaptive Communication Environment)设计模式构建的异步事件驱动模型。ACE是一个跨平台的C++框架,能够有效地处理并发和分布式系统中的复杂通信问题。 在该模型中,数据...
SpringBoot整合RabbitMQ之Spring事件驱动模型-系统源码数据库流程图 SpringBoot整合RabbitMQ实战视频教程:https://edu.csdn.net/course/detail/9314 (感兴趣也可以加QQ联系:1974544863)
Nginx事件驱动模型深度解析
我们知道linux的事件驱动模型经历了select,poll,epoll的几个阶段web服务器响应和处理web请求的过程,很多都是基于事件驱动模型的,比如ngi
在事件驱动模型中,Socket不仅仅用于数据传输,还作为触发事件的源,例如连接请求、数据到达或者连接断开。 事件模型的核心是事件循环(Event Loop),它负责监听和处理发生的事件。当一个Socket接收到新的连接请求...
Redis 是一个事件驱动的内存数据库,服务器需要处理两种类型的事件。 文件事件 时间事件 下面就会介绍这两种事件的实现原理。 文件事件 Redis 服务器通过 socket 实现与客户端(或其他redis服务器)的交互,文件...
1、传统的编程模式例如:线性模式大致流程开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->...例如:事件驱动型程序模型大致流程开始--->初始化--->等待与
总的来说,事件驱动的PHP测试框架,如Peridot,通过其独特的事件模型,为开发者提供了一种强大且灵活的测试解决方案。它使得测试过程更加可控,提高了测试的可读性和覆盖率,从而帮助开发者打造出更稳定、更健壮的...
该模型的核心特点是使用异步输入/输出(I/O)技术,同时组件内部及组件间的通信通过事件驱动模型实现。这样做的好处是可以减少等待时间,提高系统的并发处理能力。 为了实现这一模型,设计了一个基于事件驱动的异步...
事件选择模型,又称为事件驱动模型,主要是通过监听和响应系统中的特定事件来执行相应操作。在服务器开发中,这些事件可能包括客户端连接请求、数据到达、连接关闭等。常见的事件选择模型有三种:轮询模型、信号驱动...
为了克服单一事件驱动模型的不足,本文提出了一种结合事件驱动与多线程技术的混合架构。该架构试图融合两者的优点,以达到更高的并发处理能力和更低的资源消耗。 - **混合架构设计**:在高负载情况下,通过使用事件...