最近在看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,就这样啦!!!