`
霸气诠释一个男人
  • 浏览: 3729 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

事件模型到底是什么?

阅读更多
                  事件模型是个什么玩意?

    这两天在研究java的设计模式,到底什么是设计模式呢?通过多方面查找,得到下面的结论:设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。按照我的理解,我认为设计模式并不难于理解,难得是怎么合理的运用设计模式。下面先说一说事件模型,在接下来的学习过程中,会不断的总结其他的模式,请敬请期待~~~
要想弄清什么是事件模型,我们就得先找一个事例。我们就举给按钮添加动作事件模型的例子。我们都知道事件的参与者要有三部分组成,分别为事件源,监听器,和事件。事件的处理过程就是,当在事件源上触发了相应的事件,就会调用相应的事件处理器去处理这个事件,来执行相应的操作。我们来看下面的例子:点击按钮,输出”点击了按钮”。那样这个按钮就是事件源,点击按钮就是相应的事件,输出”点击了按钮”就是相应的处理操作。
JButton b1 = new JButton();
		b1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println("点击了按钮");
				
			}
		});

   上面的代码就是实现上面事件的代码,b1作为事件源,点击按钮这个动作作为事件,而实例化ActionListener,重写actionPerformed方法就是事件的相应处理器。那为什么事件源通过add<事件名>Listener方法来添加监听器呢,我们看源码可知实际上有一个保存事件监听器的listenerList,每次add时,就把这个事件监听器添加到listenerList队列中去,然后每一个事件监听器都是实现了一个事件监听器接口,重写actionPerformed(ActionEvent e)方法,来实现自己的动作。
public void addActionListener(ActionListener l) {
    	    listenerList.add(ActionListener.class, l);
    }

   然后在当点击按钮的时候,就回遍历这个队列,找到对应的事件监听器来进行相应的事件处理。源码如下:
protected void fireActionPerformed(ActionEvent event) {
        // Guaranteed to return a non-null array
        Object[] listeners = listenerList.getListenerList();
        ActionEvent e = null;
        // Process the listeners last to first, notifying
        // those that are interested in this event
        for (int i = listeners.length-2; i>=0; i-=2) {
            if (listeners[i]==ActionListener.class) {
                // Lazily create the event:
                if (e == null) {
                      String actionCommand = event.getActionCommand();
                      if(actionCommand == null) {
                         actionCommand = getActionCommand();
                      }
                      e = new ActionEvent(AbstractButton.this,
                                          ActionEvent.ACTION_PERFORMED,
                                          actionCommand,
                                          event.getWhen(),
                                          event.getModifiers());
                }
                ((ActionListener)listeners[i+1]).actionPerformed(e);
            }          
        }
    }

   好,既然我们知道了系统是如何处理事件的了,那我们自己写一个事件模型就容易的多了。我总结事件模型的建立可以依照下面几个步骤:
1. 建立事件接口
2. 建立事件监听器接口
3. 建立模拟事件源
4. 实现具体的实现上述接口的类。
   我们以客户端接收消息为例:将接收到的消息显示到一个JTextField中
代码如下:
1. 首先我们要了解这个过程中事件是什么?可知,就是一个接收消息
所以我们建立一个消息接口类:
package 接口包;
/**
 * 事件接口:消息类
 * @author YuYang
 *
 */

public interface Message {
	//得到消息的方法
	public String getMessage();
}

2. 然后要有一个事件监听接口来处理接收到的相应消息,采取动作
package 接口包;
/**
 * 事件监听器接口
 * @author YuYang
 *
 */

public interface Monitor {
	//不同的监听器采取不同的动作
	public void MonitorPro(Message m);
}。

3. 我们模拟事件源,接收消息。通过查看源代码,我们知道要创建一个储存事件监听器的队列。由于接收消息是不断的,应采取多线程。
package 事件源包;
/**
 * 模拟事件源
 */
import java.util.ArrayList;

import 实现接口包.SMessage;
import 接口包.Message;
import 接口包.Monitor;

public class NetConn extends Thread{
	//用于储存监听器对象的队列
	private ArrayList<Monitor> list = new ArrayList<Monitor>();
	//提供给队列添加对象的方法
	public void addMonitor(Monitor m){
		list.add(m);
	}
	
	public void run(){
		int i = 0;
		while (true){
			
			i ++;
			//模拟接收到的消息
			Message message = new SMessage("收到的消息"+i+"\t\n");
			//遍历监听器队列
			for(int j =0;j<list.size();j++){
				//得到相应的监听器对象
				Monitor m = list.get(j);
				//实现各自不同的动作
				m.MonitorPro(message);
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

4. 实现具体的实现上述接口的类。此步骤就是要实现相应的接口。
a) 实现消息接口,获取消息
package 实现接口包;
/**
 * 实现消息接口,模拟接收消息
 */
import 接口包.Message;

public class SMessage implements Message{
	private String message;
	
	public SMessage(String message){
		this.message = message;
	}
	@Override
	public String getMessage() {
		// TODO Auto-generated method stub
		return this.message;
	}

}

b) 实现监听器接口
package 实现接口包;
/**
 * 实现监听器接口
 */

import java.awt.TextField;

import 接口包.Message;
import 接口包.Monitor;

public class STextField extends TextField implements Monitor{

	//实现触发本监听器采取的相应动作的方法
	public void MonitorPro(Message m) {
		this.setText(m.getMessage());
		
	}

}

c)将上诉部分组装起来
package 组装包;
import java.awt.*;
import javax.swing.*;

import 事件源包.NetConn;
import 实现接口包.STextField;

public class Test {
	public static void main(String[] args) {
		JFrame jf = new JFrame();
		jf.setLayout(new FlowLayout());
		jf.setSize(100,100);
		
		NetConn nc = new NetConn();
		STextField stf = new STextField();
		nc.addMonitor(stf);
		
		nc.start();
		
		jf.add(stf);
		jf.setVisible(true);
		jf.setDefaultCloseOperation(3);
		
	}
}

这样,一个事件模型就写好了!
分享到:
评论

相关推荐

    sock_事件模型代码

    《sock_事件模型代码解析与应用》 在IT领域,特别是在网络编程中,事件模型是实现高并发、高效处理的关键技术之一。本文将围绕“sock_事件模型代码”这一主题,详细探讨其核心原理和应用,同时分析提供的压缩包文件...

    dotnet事件模型教程

    在.NET框架中,事件模型是实现对象间通信的重要机制,特别是对于那些遵循“发布/订阅”模式的应用程序。本文将深入探讨.NET事件模型的核心概念、工作原理以及如何在实际编程中应用。 首先,事件是对象状态改变时的...

    事件驱动模型实例详解(Java篇)

    ### 事件驱动模型实例详解(Java篇) #### 1. 事件驱动模型概念解析 事件驱动模型是现代软件开发中一种关键的编程模式,尤其在图形用户界面(GUI)编程中占据核心地位。该模型围绕三个核心概念构建:事件源、侦听...

    Socket网络事件通讯模型

    事件模型的核心是事件循环(Event Loop),它负责监听和处理发生的事件。当一个Socket接收到新的连接请求或数据时,事件循环会捕获这些事件,并调用相应的回调函数进行处理。这种非阻塞的I/O模型避免了程序在等待...

    javascript事件模型

    JavaScript 事件模型是Web开发中的核心概念,它定义了如何处理和响应用户或浏览器的交互。ECMAScript规范中的ECMA-357是与事件处理相关的一部分,它提供了JavaScript中处理事件的标准。 事件流是JavaScript事件模型...

    Java 开发中事件驱动模型的实例详解

    ### 一、什么是事件驱动模型? 事件驱动模型的核心理念在于,程序不是按顺序执行的,而是对发生的事件作出反应。当某个事件发生时,如用户点击按钮或系统接收到来自网络的数据包,事件处理器会捕捉到这些事件并做出...

    tcp事件选择模型服务器

    事件选择模型是一种常用的服务器编程模型,它提高了服务器处理并发请求的能力。在这个场景下,我们讨论的是一个基于事件选择模型的TCP服务器,其中包含了丰富的注释,有助于学习者深入理解。 事件选择模型,又称为...

    大白话领域驱动设计DDD视频教程

    DDD领域驱动设计到底是什么? DDD和传统三层优劣势比较 DDD在国内现象是个什么情况? DDD从战略设计到战术设计概览 第2章 领域分析模型 核心域,支撑子域,通用子域 微服务和DDD是什么关系? 传统模式下如何合理的...

    .NET事件模型教程

    对.NET的事件模型的讲解,通俗易懂

    事件选择模型经典源码

    事件选择模型是网络编程中的重要概念,特别是在设计高性能、高并发的Socket服务器时不可或缺。它允许服务器在同一时间处理多个连接,提高系统资源利用率并优化服务响应速度。在本压缩包中,"可伸缩的范例"可能包含了...

    手写DOM事件模型

    **手写DOM事件模型** 在Web开发中,DOM(Document Object Model)事件模型是JavaScript与网页交互的关键。它允许我们监听、处理和触发各种用户或浏览器产生的事件,如点击、鼠标移动、键盘输入等。本篇文章将深入...

    Java教程之AWT事件模型

    Java教程之AWT事件模型

    C#事件模型简单实例

    自己写的个C#的事件模型的实例

    详解Spring事件驱动模型

    Spring框架是Java开发中广泛应用的一个开源框架,它提供了一种事件驱动模型来增强应用程序的...在实际开发中,Spring事件模型常用于实现如日志记录、任务调度、状态更新等多种功能,大大提升了代码的灵活性和可维护性。

    事件驱动模型

    事件驱动模型是一种软件设计模式,它基于异步通信和消息传递的概念来构建应用程序。在这种模型中,系统的行为是由发生的事件来触发的,而不是由预先设定的顺序执行的指令。事件可以是用户操作、硬件状态改变、定时器...

    three.js加载obj模型添加点击事件及其他

    在本文中,我们将深入探讨如何使用three.js库加载OBJ模型并为其...总的来说,使用three.js处理3D模型是一个涉及多方面技术的过程,包括模型加载、交互事件处理和3D渲染。不断学习和实践将帮助你更好地掌握这些技能。

    stata代码 CAR计算事件研究法,包含单公司和多公司,市场模型和市场调整模型

    CAR计算,事件研究法 解决了事件日非交易日、多公司的不同公司事件日不同等问题 资料详实,超级适合小白学习: 有模型解释、数据来源和下载等详细说明: 代码中有详 细注释: 包含四种类型,请看准再下载: ①公司...

    VB\浅析ADO 事件模型

    ### ADO事件模型详解 #### 引言 在软件开发领域,尤其是数据库应用程序设计中,事件模型扮演着至关重要的角色。本文将深入探讨ADO(ActiveX Data Objects)事件模型,这是Microsoft开发的一种用于访问和操纵数据库...

    AWT 事件模型 总结:类,方法,接口

    JAVA编程基础:第七章 AWT 事件模型 总结:类,方法,接口,其中总结了如何获得事件源,实现接口方法,是对awt的一些组件的总结

Global site tag (gtag.js) - Google Analytics