Windows环境下观察者模式与Java事件处理

本文由资深IT专家荔园微风分享,通过在Windows环境下使用JAVAIDE,探讨了从JDK1.0到1.1事件模型的转变,重点讲解了基于观察者模式的Java事件处理机制,包括事件源、事件监听器和事件对象的角色以及事件处理流程,如ActionEvent的例子。此外,还介绍了自定义GUI组件和登录组件LoginBean的设计方案,展示了如何在具体目标类中实现事件通知和处理。
摘要由CSDN通过智能技术生成

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下观察者模式与Java事件处理的问题。

不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式,无从下手。为什么?因为你看的都是理论书籍。

我今天就在Windows操作系统上安装好JAVA的IDE编程工具,并通过动手来搞明白。

话说还是在2000年前后,JDK1.0及更早版本的事件模型基于职责链设计模式,但是这种模型不适用于复杂的系统。

因此在JDK1.1及以后的各个版本中事件处理模型采用基于观察者模式的委派事件模型,即一个 Java组件所引发的事件并不由引发事件的对象自己来负责处理,而是委派给独立的事件处理对象负责。

在委派事件模型中目标角色(如界面组件)负责发布事件,而观察者角色(事件处理者)可以向目标订阅它所感兴趣的事件。当一个具体目标产生一个事件时它将通知所有订阅者。

事件的发布者称为事件源(Event Source),而订阅者称为事件监听器(Event Listener),在这个过程中还可以通过事件对象(Event Object)来传递与事件相关的信息,可以在事件监听者的实现类中实现事件处理,因此事件监听对象又可以称为事件处理对象。事件源对象、事件监听对象(事件处理对象)和事件对象构成了Java事件处理模型的三要素。

事件源对象充当观察目标、而事件监听对象充当观察者。 以按钮单击事件为例、其事件处理流程如下:

(1) 如果用户在GUI中单击一个按钮, 将触发一个事件(如ActionEvent类型的动作事件),.JVM将产生一个相应的ActionEvent类型的事件对象、在该事件对象中包含了有关事件和事件源的信息,此时按钮是事件源对象。

(2) 将ActionEvent事件对象传递给事件监听对象(事件处理对象) , JDK提供了专门用于处理ActionEvent事件的接口ActionListener, 开发人员需要提供一个ActionListener 的实现类(如MyActionHandler) , 实现在ActionListener接口中声明的抽象事件处理方法 actionPerformed() , 对所发生事件做出相应的处理。

(3) 开发人员将ActionListener接口的实现类(如My Action Handler) 对象注册到按钮中, 可以通过按钮类的addActionListener() 方法来实现注册。

(4) JVM在触发事件时将调用按钮的fireXXX() 方法, 在该方法内部将调用注册到按钮中的事件处理对象的actionPerformed O方法, 实现对事件的处理。

使用类似的方法可以自定义GUI组件, 例如包含两个文本框和两个按钮的登录组件 Login Bean, 可以采用如图设计方案。

图中相关类的说明如下:

(1) LoginEvent是事件类, 用于封装与事件有关的信息, 它不是观察者模式的一部分, 但是可以在目标对象和观察者对象之间传递数据。在AWT事件模型中所有的自定义事件 类都是java.util.Event(bject的子类。

(2) LoginEventListener充当抽象观察者、它声明了事件响应方法validate Login() , 用 于处理事件.该方法也称为事件处理方法。validateL.og in() 方法将一个LoginEvent类型的事件对象作为参数,用于传输与事件相关的数据,在其子类中实现该方法,实现具体的事件处理。

(3)LoginBean充当具体目标类,在这里没有定义抽象目标类,对观察者模式进行了一定的简化。在LoginBean中定义了抽象观察者 LoginEventListener类型的对象lel和事件对象 LoginEvent,提供了注册方法 addLoginEventListener()用于添加观察者,在Java事件处理中通常使用一对一的观察者模式,而不是一对多的观察者模式,也就是说一个观察目标中只定义一个观察者对象,而不是提供一个观察者对象的集合。在LoginBean中还定义了通知方法 fireLoginEvent(),该方法在 Java事件处理模型中称为“点火方法”,在该方法内部实例化了一个事件对象LoginEvent,将用户输入的信息传给观察者对象,并且调用了观察者对象的响应方法 validateLogin()。

(4)LoginValidatorA和LoginValidatorB充当具体观察者类,它们实现了在LoginEventListener接口中声明的抽象方法 validateLogin(),用于具体实现事件处理。该方法包含一个LoginEvent类型的参数,在LoginValidatorA和 LoginValidatorB类中可以针对相同的事件提供不同的实现。

各位小伙伴,这次我们就说到这里,下次我们再深入研究windows环境下的各类设计模式实现。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值