`

四十九:观察者模式与AWT中的事件处理

阅读更多
软件系统中的事件处理允许两个或者多个对象根据它们的状态的变化进行通信和协调,在常见的事件处理模型中,对象通常被划分为三种:事件对象,事件制造者对象和事件接收者对象。一般而言,某一个对象是事件的制造者,蓁对象是事件的接收者,而事件对象本身封装了有关事件的信息,当事件制造者的内部状态发生变化时,会根据需要创建一个代表其状态变化的事件对象,并将它传给所有登记过的事件接收者对象.

java1.0的事件处理机制是建立在责任链模式的基础上的,这样的事件处理机制不能满足大型应用系统的需要,在java1.1版本里,java事件处理机制有了一个较大的变化,新的事件处理机制是建立在观察者模式基础之上的,以事件的委派为特征的委派事件模型(Delegation Event Model,DEM)。

一:DEM的结构

(A)一个类要成为事件源并不需要实现任何接口或者继承任何类,但是一个事件源需要保持一个事件监听器的列表,调用addXXXListener方法增加一个监听器,调用removeXXXListener方法删除一个监听器。
(B)事件对象,在DEM中,每种事件都有一个事件对象与之对应,而所有的AWT中的事件对象都是从java.util.EventObject继承而来的,每一种具体的事件对象都有一些额外的功能。 Swing构件引进了更多的事件类,这些事件类不是从AWTEvent衍生来的,而是直接从EventObject衍生出来的。事件对象封装了事件的源对象与事件监听器对象所需要的事件信息。有一些事件类比如PaintEvent是不会被传递给监听器的,因此对java程序员来说并没有什么用处.
(C)事件监听器对象,事件舰艇器对象是当事件发生时被调用的对象,一个对象要成为事件监听器对象必须要实现事件监听器接口,AWT库中所有的事件监听器接口都是java .util.EventListener接口的子接口。
(D)事件监听适配器:这些适配器类为它们所实现的接口提供空的实现,这样一来,一个需要处理某个事件的应用类只需要继承相应的事件适配器类,并置换掉感兴趣的方法即可,这些事件监听适配器都是缺省模式的应用.
(E)语义事件与底层事件:AWT区分了底层事件(Low-level-Event)和语义事件(Semantic Event)。一个语义事件表达了用户所做的事情,比如使用鼠标单击一个按键就是一个语义事件,相应的ActionEvent就是一个语义事件。一个底层事件则是组成各种语义事件的单纯事件,比如鼠标单击事件是由一个鼠标按下事件和一个鼠标释放事件组成,类似地调整滚动条是一个语义事件,而拖曳鼠标则是一个底层事件.
AWT中最重要的四个语义事件:
(1)ActionEvent :单击按键,选择菜单项,选择列表项,在文字框中输入文字等
(2)AdjustmentEvent :调整滚动条
(3)ItemEvent :用户在一组选择框中选择一个或者在列表中选择一项
(4)TextEvent :文字框的内容有变化
AWT中六个底层事件类:
ComponentEvent :构件大小改变,位置变化,被隐藏,被显现
KeyEvent:一个键被按下或者施放
MouseEvent:鼠标按下,释放,移动或者拖曳
FocusEvnet :一个构件得到或者失去聚焦
WindowEvent:视窗被激活,释放,最小化,关闭等。
ContainerEvent:一个构件被增加到容器中或者从容器中删除.

二:一个例子
现在请看一个例子,显示一个空视窗,接收鼠标单击事件。为了更好的说明AWT事件机制与观察者模式的关系,下面给出了四种不同的设计:
(A)第一种设计
在这个设计里,事件主题(事件源)和事件监听器是两个分开的对象,分别是ConcreteSubject和ConcreteListener,前者是可见的Frame对象,后者是在后台的事件监听对象.
从下面的代码可以看出,Frame实际上扮演了抽象主题角色,而ConcreteSubject则是具体主题角色,MouseListener接口扮演抽象观察者角色,而ConcreteListener则是具体观察者角色,从主题角色传递给抽象观察者的事件对象就是MouseEvent对象.,下面请看源码:
package cai.milenfan.basic.test; 
import java.awt.Frame; 
import java.awt.event.MouseListener; 
public class ConcreteSubject extends Frame{ 
private static MouseListener m; 
   public ConcreteSubject(){ 
   } 
   public static void main(String[] argv){ 
ConcreteSubject s = new ConcreteSubject(); 
       m = new ConcreteListener(); 
       s.setBounds(100, 100, 100 , 100); 
       s.addMouseListener(m); 
       s.show(); 
   } 
} 


package cai.milenfan.basic.test; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
public class ConcreteListener implements MouseListener{ 
ConcreteListener() { 
} 
public void mouseClicked(MouseEvent e) { 
System.out.println(e.getWhen()); 
} 
public void mousePressed(MouseEvent e) { 
} 
public void mouseReleased(MouseEvent e) { 
} 
public void mouseEntered(MouseEvent e) { 
} 
public void mouseExited(MouseEvent e) { 
} 
} 


第二种方案:这种方案用了事件适配器类MouseAdapter,它实现了MouseListener接口,为所有的方法都提供了空实现,这样ConcreteListener类就只需要继承MouseAdapter并且置换mouseClicked方法就可以了。代码略.

第三种方案:这种方案的主题和监听器是合二为一的:这个类继承了Frame类,并且实现了MouseListener接口:
package cai.milenfan.basic.test; 
import java.awt.Frame; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
public class ConcreteSubject extends Frame implements MouseListener{ 
     private static MouseListener m; 
     public ConcreteSubject(){ 
     } 
     public void mouseClicked(MouseEvent e){ 
System.out.println(e.getWhen()); 
} 
     public void mousePressed(MouseEvent e){} 
     public void mouseReleased(MouseEvent e){} 
     public void mouseEntered(MouseEvent e){} 
     public void mouseExited(MouseEvent e){} 
     public static void main(String[] argv){ 
ConcreteSubject s = new ConcreteSubject(); 
s.setBounds(100, 100, 100 , 100); 
s.addMouseListener(s); 
     s.show(); 
} 
} 


第四种设计是Java设计师的常用设计,在这个设计中,视窗是ConcreteSubject类,而事件监听器则由一个内部无名类实现:
package cai.milenfan.basic.test; 
import java.awt.Frame; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
public class ConcreteSubject extends Frame{ 
public ConcreteSubject(){ 
    } 
public static void main(String[] argv){ 
ConcreteSubject s = new ConcreteSubject(); 
s.setBounds(100, 100, 100 , 100); 
s.addMouseListener( new MouseListener() { 
public void mouseClicked(MouseEvent e) { 
System.out.println(e.getWhen()); 
} 
public void mousePressed(MouseEvent e){} 
public void mouseReleased(MouseEvent e){} 
public void mouseEntered(MouseEvent e){} 
public void mouseExited(MouseEvent e){} 
} 
      ); 
     s.show(); 
} 
    private MouseListener lnkMouseListener; 
}
分享到:
评论

相关推荐

    观察者模式在Java事件处理中的应用研究.pdf

    在Java事件处理机制中,观察者模式被广泛应用于事件处理机制中,例如AWT中的事件处理机制。AWT事件处理机制使用观察者模式来处理事件,事件源(Event Source)作为被观察者,事件监听器(EventListener)作为观察者...

    Java设计模式-第22章-观察者模式.ppt

    Java事件处理机制,如AWT和Swing中的事件监听,也是基于观察者模式。例如,按钮点击事件就是一个典型的例子,按钮(事件源)是观察目标,而监听按钮点击的事件处理器(事件监听器)就是观察者。 **观察者模式与MVC*...

    2 观察者模式-课程内容.rar

    - 发布-订阅(Publish/Subscribe)模式:与观察者模式相似,但更强调事件和事件处理的概念,允许事件的广播。 - 组合模式:在处理大量对象时,可以结合使用组合模式,将多个观察者组合成一个树形结构,方便管理和...

    9.观察者模式.doc

    在实际开发中,观察者模式广泛应用于各种事件处理,例如GUI组件的事件监听、发布-订阅系统、数据变更通知等场景。通过使用观察者模式,开发者可以构建更加模块化、易于维护的系统,提高代码的可重用性和可扩展性。

    2 观察者模式-MOOC课程内容.pdf

    观察者模式在软件体系结构中扮演着重要的角色,特别是在需要动态订阅和通知场景下,例如UI组件更新、事件驱动编程和MVC架构。 在观察者模式中,通常包含以下几个主要的参与者: 1. Subject(主题):定义观察者...

    java事件处理机制Demo

    本示例"java事件处理机制Demo"将深入探讨Java的观察者模式(Observer Pattern)及其在实际项目中的应用。 首先,我们来理解什么是观察者模式。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当...

    java中监听机制,以及观察者设计模式

    这样,当按钮被点击(事件发生)时,不仅会执行监听器中的动作,还可以更新其他依赖于这个事件的状态,符合观察者模式的定义。 在实际项目中,监听机制和观察者设计模式常用于构建响应式的用户界面、实现业务逻辑的...

    事件处理编程范例

    Java中的事件模型基于观察者模式,其中事件源是被观察的对象,事件监听器是观察者。当事件源发生事件时,它会通知所有注册的监听器。在Java AWT和Swing库中,提供了丰富的组件和事件类型,如ActionEvent、MouseEvent...

    awt 技术必备

    3. **事件(Event)**与**事件处理(Event Handling)**:AWT的事件模型基于观察者模式,组件可以产生事件(如鼠标点击或键盘输入),而事件监听器则负责处理这些事件。开发者可以为组件添加事件监听器,通过实现特定的...

    java中的事件机制

    Java中的事件机制是Java编程中一个重要的概念,它基于观察者模式(Observer Pattern)来实现对象之间的通信。观察者模式是一种行为设计模式,允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的...

    Java事件处理框架

    Java事件处理主要基于观察者模式(Observer Pattern),在这种模式中,事件源(通常是GUI组件,如按钮、文本框等)会发布事件,而事件监听器则订阅这些事件并执行相应的处理逻辑。Java AWT和Swing库提供了丰富的事件...

    Java观察者模式-模拟Awt Button

    通过这种方式,我们模拟了AWT中Button的事件触发机制,展示了观察者模式如何工作。每个监听器(MyActionListener1和MyActionListener2)都是Button状态变化的观察者,当Button的状态(被点击)发生变化时,它们都会...

    Java事件处理机制教学方法探讨.zip

    Java事件处理基于观察者模式(Observer Pattern),其中事件源(如按钮或菜单)是被观察的对象,而事件监听器是观察者,负责处理由事件源触发的事件。Java AWT(Abstract Window Toolkit)和Swing库提供了丰富的组件...

    软件设计模式文档资源详细描述

    软件设计模式是软件开发中的一种经验总结,它们是解决常见问题...观察者模式在实际应用中广泛存在,例如Smalltalk的MVC框架和Java的AWT/Swing事件模型。理解并熟练运用观察者模式有助于创建可扩展、低耦合的软件系统。

    JAVA事件处理指南

    首先,Java事件处理基于Observer模式,即观察者模式。在这种模式下,事件源(通常是GUI组件,如按钮、文本框等)是被观察的对象,当它们的状态发生改变时,会触发事件。而事件监听器则是观察者,注册到事件源上,...

    第9章Java事件处理共44页.pdf.zip

    1. **事件模型**:Java事件处理基于观察者模式,其中事件源(如按钮、文本框)生成事件,而事件监听器接收并处理这些事件。 2. **AWT和Swing事件**:Java提供了两种基本的GUI库,Abstract Window Toolkit (AWT) 和 ...

    OOAD.rar_设计模式 例

    7. **处理事件**:每个观察者在其更新方法中处理接收到的事件,执行相应的业务逻辑。 在给出的例子中,开发者可能创建了一个简单的AWT程序,包括一个按钮和一个监听按钮点击事件的监听器。当按钮被点击时,它作为...

    java的.awt包和java.util包的区别

    - 提供了观察者模式的实现,如**EventObject**、**EventListener**等。 5. **国际化**: - **Locale**:表示特定地理位置的文化习惯。 - **ResourceBundle**:用于读取和处理不同语言资源的类。 #### Java.awt...

    Swing MVC 观察者 电子相册

    综上所述,Swing MVC模式、观察者模式、系统托盘和SwingWorker都是构建高效、用户友好的电子相册应用的关键技术。通过合理利用这些组件和设计模式,我们可以创建出既美观又实用的Java桌面应用。

Global site tag (gtag.js) - Google Analytics