监听器模型涉及以下三个对象,模型图如下:

1)事件:用户对组件的一个操作

2)事件源:发生事件的组件就是事件源

3)事件监听器(处理器):监听并负责处理事件的方法

java-listener-listener-principles-and-implementation-01

执行顺序如下:

1、给事件源注册监听器

2、组件接受外部作用,也就是事件被触发

3、组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器

4、事件处理器启动,并执行相关的代码来处理该事件。

 

监听器模式:

事件源注册监听器之后,当事件源触发事件,监听器就可以回调事件对象的方法;

更形象地说,监听者模式是基于:注册-回调的事件/消息通知处理模式,就是被监控者将消息通知给所有监控者。 

1、注册监听器:事件源.setListener

2、回调:事件源实现onListener

 

两个示例

示例一:简化了上图模型,仅仅包含事件源与监听器

项目文件结构:

java-listener-listener-principles-and-implementation-02

IEventListener.java 

package com.mimvp.event;

/**
 * 事件监听器,事件处理器 
 */
public interface IEventListener {
	void onclickButton();
}

 

EventSource.java

package com.mimvp.event;

/**
 * 事件源:事件发生的地点 
 */
public class EventSource {
	private IEventListener mEventListener;

	public EventSource() {
		// TODO Auto-generated constructor stub
	}

	// 注册监听器
	public void setEventListener(IEventListener listener) {
		this.mEventListener = listener;
	}
	
	// 触发事件
	public void EventHappened() {
		this.mEventListener.onclickButton();
	}
}

 

EventTest.java

package com.mimvp.event;

public class EventTest {
	public static void main(String[] args) {
		// 事件源(被监听的对象)
		EventSource eventSource = new EventSource();
		
		// 监听器(实现接口方法)
		IEventListener mEventListener = new IEventListener() {
			@Override
			public void onclickButton() {
				// TODO Auto-generated method stub
				System.out.println("You click button");
			}
		};
		
		// 注册监听器到事件源 
		eventSource.setEventListener(mEventListener);
		eventSource.EventHappened();
	}
}

实验结果

You click button

 

 

示例二:完整模型的demo

项目文件结构:

java-listener-listener-principles-and-implementation-03

IMEvent.java

package com.mimvp.event2;

/**
 * 事件接口
 */
public interface IMEvent {
	void setEventListener(IMEventListener iMEventListener);
	
	boolean ClickButton();
	
	boolean MoveMouse();
}

 

IMEventListener.java

package com.mimvp.event2;

/**
 * 事件监听器,调用事件处理器 
 */
public interface IMEventListener {
	void doEvent(IMEvent iMEvent);
}

 

MEventSource.java

package com.mimvp.event2;

public class MEventSource implements IMEvent {
	private IMEventListener iMEventListener;
	boolean button;
	boolean mouse;

	public MEventSource() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public void setEventListener(IMEventListener iMEventListener) {
		this.iMEventListener = iMEventListener;
	}

	@Override
	public boolean ClickButton() {
		return this.button;
	}

	@Override
	public boolean MoveMouse() {
		return this.mouse;
	}

	// 触发事件
	public void mouseEventHappened(){
		this.iMEventListener.doEvent(this);
	}
	
	public void setButton(boolean button) {
		this.button = button;
	}
	
	public void setMouse(boolean mouse) {
		this.mouse = mouse;
	}
}

 

MEventSource2.java

package com.mimvp.event2;

public class MEventSource2 implements IMEvent {
	private IMEventListener iMEventListener;
	boolean button;
	boolean mouse;

	public MEventSource2() {
		// TODO Auto-generated constructor stub
	}

	public void setEventListener(IMEventListener iMEventListener) {
		this.iMEventListener = iMEventListener;
	}

	@Override
	public boolean ClickButton() {
		return this.button;
	}

	// 触发事件
	public void buttonEventHappened(){
		button = true;
		iMEventListener.doEvent(this);
	}
	
	@Override
	public boolean MoveMouse() {
		return this.mouse;
	}

	public void setButton(boolean button) {
		this.button = button;
	}

	public void setMouse(boolean mouse) {
		this.mouse = mouse;
	}
}

 

EventTest.java

package com.mimvp.event2;

/**
 * mimvp.com
 */
public class EventTest {
	public static void main(String[] args) {
		// 事件源(被监听的对象)
		MEventSource mEventSource = new MEventSource();
		MEventSource2 mEventSource2 = new MEventSource2();
		
		// 监听器
		IMEventListener iMEventListener = new IMEventListener() {
			@Override
			public void doEvent(IMEvent iMEvent) {
				if(true == iMEvent.ClickButton()) {
					System.out.println("You click button");
				}
				else if(true == iMEvent.MoveMouse()) {
					System.out.println("You move mouse");
				}
			} 
		};
		
		// 注册监听器到事件源  
		System.out.println("+++ mEventSource +++");
		mEventSource.setEventListener(iMEventListener);
		mEventSource.setMouse(true);					// 赋值状态
		mEventSource.mouseEventHappened();		// 触发鼠标事件
		
		// 注册监听器到事件源  
		System.out.println("+++ mEventSource2 +++");
		mEventSource2.setEventListener(iMEventListener);
		mEventSource2.buttonEventHappened();	// 触发按钮事件
	}
}

 

【实验结果】

+++ mEventSource +++
You move mouse
+++ mEventSource2 +++
You click button

 

 

参考推荐

Java 监听器(Listener)的工作原理和代码演示