Java中的DEM事件机制
AWT中的DEM机制
责任链模式一章中曾谈到,AWT1.0的事件处理的模型是基于责任链的。这种模型不适用于复杂的系统,因此在AWT1.1版本及以后的各个版本中,事件处理模型均为基于观察者模式的委派事件模型(Delegation Event Model或DEM)。
在DEM模型里面,主题(Subject)角色负责发布(publish)事件,而观察者角色向特定的主题订阅(subscribe)它所感兴趣的事件。当一个具体主题产生一个事件时,它就会通知所有感兴趣的订阅者。
使用这种发布-订阅机制的基本设计目标,是提供一种将发布者与订阅者松散地耦合在一起的联系形式,以及一种能够动态地登记、取消向一个发布者的订阅请求的办法。显然,实现这一构思的技巧,是设计抽象接口,并把抽象层和具体层分开。这在观察者模式里可以清楚地看到。
使用DEM的用词,发布者叫做事件源(event source),而订阅者叫做事件聆听者(event listener)。在Java里面,事件由类代表,事件的发布是通过同步地调用成员方法做到的。
Servlet技术中的的DEM机制
AWT中所使用的DEM事件模型实际上被应用到了所有的Java事件机制上。Servlet技术中的事件处理机制同样也是使用的DEM模型。
SAX2技术中的DEM机制
DEM事件模型也被应用到了SAX2的事件处理机制上。
观察者模式的效果
观察者模式的效果有以下的优点:
第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。
第二、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知,
观察者模式有下面的缺点:
第一、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
第二、如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。
第三、如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
第四、虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。
观察者模式与其它模式的关系
观察者模式使用了备忘录模式(Memento Pattern)暂时将观察者对象存储在被观察者对象里面。
问答题
第一题、我和妹妹跟妈妈说:“妈妈,我和妹妹在院子里玩;饭做好了叫我们一声。”请问这是什么模式?能否给出类图说明?
问答题答案
第一题答案、这是观察者模式。我和妹妹让妈妈告诉我们饭做好了,这样我们就可以来吃饭了。换用较为技术化的语言来说,当系统的主题(饭)发生变化时,就告诉系统的其它部份(观察者们,也就是妈妈、我和妹妹),使其可以调整内部状态(有开始吃饭的准备),并采取相应的行动(吃饭)。
系统的类图说明如下:
系统的类图
来源:http://www.yesky.com/140/1614140_3.shtml
分享到:
相关推荐
Java的事件处理机制主要采用了**观察者模式**下的**委派事件模型**(Delegation Event Model, DEM)。在这个模型中,事件处理过程涉及到了三个核心概念: 1. **事件源**(Subject):即事件发生的对象,例如用户界面...
在“ltc_viewflow-dem”这个项目中,我们可以期待看到如何巧妙地使用Java语言来构建这样的组件。通过研究源码,我们可以学习到如何处理触摸事件,如何动态加载和切换视图,以及如何优化视图的滚动性能。 在JAVA代码...
首先,"ltc_viewflow-dem"这个名字中的"ViewFlow"是一个常见的Android UI组件,它提供了一种平滑的水平滚动视图效果,常用于展示一系列相似的界面元素,如图片或卡片。开发者可以利用ViewFlow实现类似iOS中的...
5. **用户交互**:Java的事件监听机制用于处理玩家的键盘、鼠标输入,实现游戏控制。 6. **音频处理**:开源项目可能使用 jogl(Java Bindings for OpenGL)或者其他库来播放音效和背景音乐。 7. **状态管理**:...
4. **数据绑定与状态管理**:小程序中的数据绑定机制使得视图和模型能够实时同步。在"飞翔的小鸟"游戏中,小鸟的位置、分数、游戏状态等都需要在页面中实时更新。因此,开发者需要理解如何使用wx.setStorageSync和wx...
JSON-P提供了处理JSON的API,而JSON-B则提供了将Java对象自动绑定到JSON的机制,简化了与JSON数据的交互。 这些示例程序涵盖了上述技术点,通过实践运行和分析代码,读者可以深入学习Java EE 8的各种特性,并掌握...
Spring Boot集成Spring Security是开发基于Java的Web应用时常见的安全框架选择。Spring Security提供了一整套强大且灵活的安全控制机制,使得开发者可以轻松地实现身份验证、授权以及各种安全功能。下面将详细介绍...
"WorldWind"是一个开源的Java和JavaScript应用程序接口(API),由美国国家航空航天局(NASA)开发,用于创建地球可视化应用。这个"PluginDemo"是基于WorldWind的一个示例项目,旨在展示如何为WorldWind添加自定义...
在提供的压缩包`thinkphp_auth-master`中,可能包含了实现这一功能的示例代码和数据库结构,你可以通过下载并运行这个示例来更好地理解和应用Auth权限认证机制。在实际开发中,根据项目的具体需求,你可能还需要...
在"Juego-Android"项目中,学生将学习到Java的基本语法,包括类、对象、方法、变量等概念,以及异常处理、多线程等进阶主题。此外,Java的集合框架如ArrayList和HashMap也是实现游戏逻辑和存储数据的关键工具。 二...
3. **签名机制**: 微信支付的每个请求和响应都需要进行签名验证,以防止数据被篡改。开发者需要掌握如何生成和验证签名,通常是使用MD5或SHA-256算法。 4. **商户平台配置**: 在接入微信支付前,开发者需要在微信...
3. **异常处理**:在处理数值计算时,可能会遇到除零错误、数字格式异常等问题,因此Java的异常处理机制(try-catch-finally)会被用来捕获并处理这些潜在错误。 4. **输入/输出**:如果DemCalculator有用户界面,...
在WorldWindJava-2.2.1源码中,我们可以深入学习以下几个关键知识点: 1. **Java编程**:WorldWindJava完全用Java语言编写,因此,熟悉Java基础是理解源码的前提。包括面向对象编程概念、类、接口、异常处理、多...
总结起来,这个项目演示了如何在现代Java开发环境中,利用Maven进行模块化构建,结合Spring Boot的便捷性,Dubbo的服务治理,Zookeeper的协调服务,以及Redis的数据缓存,来打造一个完整的分布式应用。对于理解和...
在这一版中,作者不仅对原有内容进行了精简和改进,去除了他个人不太满意的部分,如练习题和Java示例,而且还大幅扩展和重新组织了大量主题,以提供更全面、深入的知识覆盖。 ### Enigma机器章节的扩充 本书特别...
**Maven**是一种自动化的构建工具,主要用于Java项目的构建和依赖管理。它通过一种项目对象模型(Project Object Model,简称POM)来管理项目的构建过程,使得项目的构建流程标准化。 - **何为Maven:** - Maven...
总的来说,DevGRFL 是 Minecraft 社区中的一款创新之作,它通过 Java 技术为玩家带来了更丰富的游戏体验。其精心设计的花卉生态、多样化的种植策略以及开放的 API,都为 Minecraft 的世界注入了新的活力。如果你是 ...
Java的核心特点包括垃圾回收机制、异常处理、多线程支持以及丰富的类库。 在Java中,可能的实现方式是创建一个程序来计算和处理地形的海拔数据。这可能涉及到对地理数据的处理,如使用GeoTools库,这是一个开源的...
在这个游戏中,Java不仅用于客户端的图形用户界面,还用于与服务器的通信,实现了用户通过Java小程序实时连接到服务器的功能。这得益于Java的网络编程能力,使得玩家能够在任何支持Java的设备上享受游戏,无论他们...