`

事件驱动

    博客分类:
  • 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,就这样啦!!!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics