`

事件驱动

    博客分类:
  • java
 
阅读更多

最近在看java相关一些知识,发现很多关于事件驱动的东东,对事件驱动也不是很了解。通过网上浏览资料,了解了事件驱动的一些知识。

事件模型驱动的三要素

事件源:能够接收外部事件的源体。 

侦听器:能够接收事件源通知的对象。 

事件处理程序:用于处理事件的对象。

 

自己写了一个例子。讲的是一个小孩睡醒了(发生了睡醒的事件),接着父亲起来开灯,母亲给小孩喂奶。so easy。直接上代码。

 

小孩类(事件源

 

public class Child {

	private String childName;
	
	public void weakUp(){
		Event event = new WeakUpEvent(ChildEventName.WEAKUP, this); //发生了睡醒事件
		EventDispatcher dispatcher = EventDispatcherImpl.getInstance();
		dispatcher.dispatchEvent(event); //发布事件
	}


	public void setChildName(String childName) {
		this.childName = childName;
	}


	public String getChildName() {
		return childName;
	}
}

 

Event事件类

 

public class Event {

	private String eventName; //事件名称
	
	private Object eventSource; //事件源
	
	public Event(String _eventName,Object _eventSource){
		this.eventName = _eventName;
		this.eventSource = _eventSource;
	}
	
	public Object getEventSource(){
		return eventSource;
	}
	
	public void setEventSource(Object eventSource){
		this.eventSource = eventSource;
	}

	public void setEventName(String eventName) {
		this.eventName = eventName;
	}

	public String getEventName() {
		return eventName;
	}
	
}

 

 

WeakUpEvent具体的事件类

 

public class WeakUpEvent extends Event{

	public WeakUpEvent(String eventName, Object eventSource) {
		super(eventName, eventSource);
		// TODO Auto-generated constructor stub
	}
}

 

 

EventDispatcher事件管理中心

 

 

public interface EventDispatcher {

	public void addEventListener(String eventName, EventListener eventListener);

	public boolean hasEventListener(String eventName);

	public void removeEventListener(String eventName,
			EventListener eventListener);

	public void dispatchEvent(Event event);
	
}

EventDispatcherImpl具体的事件管理中心

import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

public class EventDispatcherImpl implements EventDispatcher{
	
	private static EventDispatcher instance = null;
	
	private EventDispatcherImpl(){
		
	}
	
	private Map<String, Set<EventListener>> listenerQueue = new ConcurrentHashMap<String, Set<EventListener>>();

	@Override
	public void addEventListener(String eventName, EventListener eventListener) {
		// TODO Auto-generated method stub
		Set<EventListener> listeners = listenerQueue.get(eventName);
		if(listeners == null){
			listeners =  new CopyOnWriteArraySet<EventListener>();
			listenerQueue.put(eventName, listeners);
		}
		listeners.add(eventListener);
		
	}

	@Override
	public void dispatchEvent(Event event) {
		// TODO Auto-generated method stub
		 Set<EventListener> listeners = (Set<EventListener>)this.listenerQueue.get(event.getEventName());
	     if (listeners != null && listeners.size() > 0)
	     {
	       for (EventListener listener : listeners)
	       {
	    	   listener.performed(event);
	       }
	     }
	}

	@Override
	public boolean hasEventListener(String eventName) {
		// TODO Auto-generated method stub
		Set<EventListener> listeners =  this.listenerQueue.get(eventName);
		if(listeners != null && listeners.size() >0){
			return true;
		}
		return false;
	}

	@Override
	public void removeEventListener(String eventName,
			EventListener eventListener) {
		// TODO Auto-generated method stub
		Set<EventListener> listeners =  this.listenerQueue.get(eventName);
		if(listeners != null){
			listeners.remove(eventListener);
		}
	}
	
	public synchronized static EventDispatcher getInstance(){
		if(instance == null){
			instance = new EventDispatcherImpl();
		}
		return instance;
	}

}

 

EventListener侦听器

 

public interface EventListener {

	public void performed(Event event); //事件处理方法
}

 

 

客户端代码

 

public class Client {

	public static void main(String[] args) {
		Client client = new Client();
		client.registerListener();
		Child child = new Child();
		child.setChildName("小白");
		child.weakUp();
	}

	private void registerListener() {//注册侦听器
		EventListener father = new EventListener() {
			@Override
			public void performed(Event event) {
				// TODO Auto-generated method stub
				Child child = (Child) event.getEventSource();
				System.out.println(child.getChildName() + "发生了 "
						+ event.getEventName() + " 的事件");
				System.out.println("父亲赶紧开灯、、、");
			}
		};

		EventListener mother = new EventListener() {
			@Override
			public void performed(Event event) {
				// TODO Auto-generated method stub
				Child child = (Child) event.getEventSource();
				System.out.println(child.getChildName() + "发生了 "
						+ event.getEventName() + " 的事件");
				System.out.println("母亲给" + child.getChildName() + "喂奶、、、");
			}
		};

		EventDispatcher dispatcher = EventDispatcherImpl.getInstance();
		dispatcher.addEventListener(ChildEventName.WEAKUP, father);
		dispatcher.addEventListener(ChildEventName.WEAKUP, mother);
	}
}

 

 

事件类型

 

public class ChildEventName {

	public static String  WEAKUP = "睡醒了";
}

 

 

 

在代码中,只是简单的打印一下,取代用于处理事件的对象。OK,就这样啦!!!

分享到:
评论

相关推荐

    基于STM32的事件驱动框架的应用

    《基于STM32的事件驱动框架的应用》这篇文章探讨了如何改善传统嵌入式单片机开发中的问题,提出了一种采用事件驱动型层次式状态机的 QuantumPlatform 量子框架与STM32单片机结合的解决方案。STM32,全称基于ARM ...

    施耐德事件驱动自动化控制编程技术白皮书

    ### 施耐德事件驱动自动化控制编程技术白皮书关键知识点解析 #### 一、引言及背景 随着工业4.0的推进和技术的发展,自动化控制领域的编程模式也需要与时俱进。传统上,自动化控制编程依赖于基于固定时间扫描周期的...

    单片机程序设计中运用事件驱动机制

    ### 单片机程序设计中运用事件驱动机制 #### 摘要 本文探讨了如何在单片机程序设计中引入事件驱动机制,通过实际案例分析了这种方法的优点,特别是能够提高系统对多中断的实时响应能力,并降低多中断系统调试的难度...

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

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

    EPC(事件驱动过程链)简介

    EPC(事件驱动过程链)简介 EPC(事件驱动过程链)是一种强大的业务流程建模方法,旨在描述和分析复杂的商业业务流程。EPC 模型通过将业务过程中的静态资源(系统、组织、数据等)组织在一起,形成一个能够完成特定...

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

    在Java开发领域,事件驱动模型(Event-Driven Model)是一种广泛采用的设计模式,它通过响应外部事件来触发程序中的特定行为。本文将深入探讨Java中事件驱动模型的应用,特别是通过Swing框架的具体实例来解析这一...

    一个事件驱动的嵌入式控制器框架(基于STM32平台)

    Q-Controllers是一个事件驱动的应用代码框架,适用于低端单片机无法跑操作系统,但又要处理越来越复杂的代码构架的情况。 因为不依赖于操作系统,所以非常容易被移植到stm32之外的其他单片机上。即便不进行移植,...

    嵌入式系统的事件驱动型编程技术 第二版(中文)

    事件驱动型编程技术是嵌入式系统中常见的一种编程模型,尤其适用于实时性和响应速度要求高的应用。《嵌入式系统的事件驱动型编程技术 第二版》深入探讨了这一主题,为开发者提供了宝贵的理论知识和实践经验。 QP...

    数据结构-队列-事件驱动编程

    在IT领域,事件驱动编程是一种常见的编程模型,它主要用于构建响应用户输入、系统状态变化或者外部消息的应用程序。本文将详细解析如何利用数据结构中的队列来实现事件驱动编程,并结合给定的“银行排队”场景进行...

    基于事件驱动单片机程序设计

    在电子工程和嵌入式系统领域,事件驱动的单片机程序设计是一种常见的编程模型,它使得硬件设备和软件能够高效地协同工作。基于事件驱动的设计理念,单片机能够实时响应外部或内部发生的特定事件,如传感器输入、按键...

    事件驱动51程序通用框架代码

    标题中的“事件驱动51程序通用框架代码”指的是在51单片机上采用事件驱动编程模式的一个通用软件架构。51单片机是微控制器的一种,广泛应用于嵌入式系统设计,尤其适合初学者和低功耗应用。事件驱动编程是一种编程...

    一个事件驱动的嵌入式控制器框架(基于STM32平台).zip

    Q-Controllers是一个事件驱动的应用代码框架,适用于低端单片机无法跑操作系统,但又要处理越来越复杂的代码构架的情况。 因为不依赖于操作系统,所以非常容易被移植到stm32之外的其他单片机上。即便不进行移植,...

    引入事件驱动机制的程序框架

    事件驱动机制是软件设计中的一种常见模式,尤其在嵌入式系统和实时操作系统中广泛应用。51单片机是一款常见的微控制器,广泛用于各种小型电子设备。本程序框架将事件驱动的概念引入到51单片机的编程中,旨在提高程序...

    面向对象之事件驱动

    事件驱动编程(Event-Driven Programming,EDP)是一种编程模型,其中程序的执行由外部事件触发。在EDP中,程序不再按照预定的顺序执行,而是等待并响应各种事件,如用户输入、网络请求或定时器触发。这种模式常用于...

    c++实现的对象事件驱动机制

    在编程领域,事件驱动机制是一种常见的软件设计模式,它基于观察者模式,使得程序能够对特定事件的发生作出反应。在本场景中,我们讨论的是如何使用C++来实现这种机制,而不依赖任何特定的平台库。C++本身并不内置...

    浅析基于事件驱动会计信息系统的会计运用

    在探讨基于事件驱动会计信息系统的会计运用时,首先要明确会计信息系统的基本概念。会计信息系统是一套由人、数据、程序和信息处理设备组成,旨在收集、存储、处理、报告和解释组织的财务数据和相关信息的系统。而...

    事件驱动的PHP测试框架.zip

    事件驱动编程是一种编程范式,它基于事件(如用户操作、硬件状态变化或网络通信)的发生,通过回调函数或者事件监听器来响应这些事件。在测试领域,事件驱动框架允许我们更加精细地控制测试流程,使测试更接近实际...

    simjava2离散事件驱动仿真

    《深入理解SimJava2:离散事件驱动仿真的核心与应用》 SimJava2是一款强大的离散事件驱动仿真工具,其在云计算和网格计算领域的应用广泛而深入。本文将全面解析SimJava2的核心原理,以及如何利用它进行复杂的计算...

    事件驱动 银行模拟系统

    实现中,可以用时间代表银行活动的对象,用事件驱动来模拟这些活动,并以概率(随机数发生器)来描述预期的客户到达时间间隔和银行职员为一个顾客服务所需的时间。 在实验中,可改变参数(如银行窗口数、客户到达率...

    事件驱动框架 EDA

    事件驱动框架(Event-driven Architecture,简称EDA)是一种软件架构设计方法,它允许组件或服务在独立的、非耦合的环境中运行,它们之间通过事件触发消息传递。EDA的特点在于,事件发生时,相关信息会被发布到一个...

Global site tag (gtag.js) - Google Analytics