监听器模式有三个要素:
事件源:顾名思义,事件发生的源头,比如点击的按钮,可以工作可以运作的机器人,属于被监听的对象
事件对象:这个经常和事件源混淆,它经常被用来包装事件源,或者说执行某个方法,比如点击事件,机器人程序执行
监听器:这个是监听器模式的核心,定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参
当事件源对象上发生操作时,将会调用时间监听的一个方法,并在调用方法的时候把事件对象传递过去

执行顺序:
1.给事件源注册监听器
2.组件接受外部作用,也就是事件触发
3.组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器
4.事件处理器启动,并执行相关代码来处理事件
监听器模式:事件源注册监听器后,当事件源触发事件,监听器就可以回调事件对象的方法;
更加形象地说,监听者模式就是基于:注册-回调事件/消息通知处理模式,就是被监听者将消息通知给所有监控者
1.注册监听器:事件源.setListener
2.回调:事件源实现onListener
/**
* 事件源:机器人
*/
public class Robot{
private RobotListener listener;
/**
* 注册机器人监听器
* @param listener
*/
public void registerListener(RobotListener listener){
this.listener = listener;
}
/**
* 工作
*
*/
public void working() {
if (listener != null){
Even even = new Even(this);
this.listener.working(even);
}
System.out.println("robot 开始 工作.......");
}
/**
* 跳舞
*
*/
public void dancing() {
if (listener != null){
Even even = new Even(this);
this.listener.dancing(even);
}
System.out.println("robot 开始 跳舞.......");
}
}
/**
* 监听器接口
*/
public interface RobotListener {
/**
* 工作
* @param even
*/
void working(Even even);
/**
* 跳舞
* @param even
*/
void dancing(Even even);
}
public class MyRobotListener implements RobotListener {
/**
* 工作
*
* @param even
*/
@Override
public void working(Even even) {
Robot robot = even.getRobot();
System.out.println("机器人开始工作,防止偷窥.....");
}
/**
* 跳舞
*
* @param even
*/
@Override
public void dancing(Even even) {
Robot robot = even.getRobot();
System.out.println("机器人开始跳舞,防止走神.....");
}
}
/**
* 事件对象
*/
public class Even {
private Robot robot;
public Even() {
super();
}
public Even(Robot robot) {
super();
this.robot = robot;
}
public Robot getRobot(){
return robot;
}
public void setRobot(Robot robot) {
this.robot = robot;
}
}
public class TestListener {
public static void main(String[] args) {
Robot robot = new Robot();
robot.registerListener(new MyRobotListener());
robot.working();
robot.dancing();
}
}
or
/**
* 监听器接口
*/
public interface EventListener extends java.util.EventListener {
/**
* 事件处理
* @param eventObject
*/
void handleEvent(EventObject eventObject);
}
/**
* 事件对象
*/
public class EventObject extends java.util.EventObject {
public EventObject(Object source) {
super(source);
}
public void doEvent(){
System.out.println("通知一个事件源 source:"+this.getSource());
}
}
/**
* 事件源
*/
public class EventSource {
// 监听器列表,
private List<EventListener> listeners = new ArrayList();
public void addListener(EventListener listener){
listeners.add(listener);
}
public void removeListener(EventListener listener){
listeners.remove(listener);
}
public void notifyListenerEvent(EventObject eventObject){
listeners.forEach(x->{
x.handleEvent(eventObject);
});
}
}
测试执行
public class EventDome {
public static void main(String[] args) {
EventSource eventSource = new EventSource();//事件源
eventSource.addListener(eventObject -> {
eventObject.doEvent();
if (eventObject.getSource().equals("closeWindow")) {
System.out.println("doClose。。。。。"); //回调
}
});
EventObject eventObject = new EventObject("closeWindow"); // 事件对象
eventSource.notifyListenerEvent(eventObject); // 触发事件
}
}
通知一个事件源 source:closeWindow
doClose。。。。。
EventListener是一个回调接口类,handleEvent是一个回调函数接口