监听器模式包含了三个元素,即事件源,事件对象,监听器。其中,事件源,顾名思义,即时间发生的源头,是一个实体。事件对象,则强调的是一个动作,监听器想让事件源做的事情。而监听器则是监听事件源做某件事的时候出发事件对象的动作。
举一个简单的例子,小明很喜欢出去玩泥巴,常常把手弄得脏脏的。每当吃饭的时候,妈妈都会让小明在吃饭之间先把手洗赶紧了。那么,这个时候,事件源就是熊孩子小明,事件对象就是饭前洗手,那么监听器要干的事就是要在小明吃饭前让他先把手洗干净。
package ListenerPattern.formal;
import java.util.ArrayList;
import java.util.List;
public class Kid {
private String name;
private List<Listener> listeners;
public Kid(String name) {
this.name = name;
this.listeners = new ArrayList<Listener>();
}
public void eat(){ // 执行吃饭这个动作前,监听器会执行先洗手的动作
for (Listener listener: listeners){
if(listener instanceof WashingHandsListener){
WashingHandsListener washingHandsListener = (WashingHandsListener) listener;
washingHandsListener.fireAfterEventInvoked(new WashingHandsEvent(this,"洗手"));
}
}
System.out.println("吃饭...");
}
public void addListener(Listener listener){
listeners.add(listener);
}
}
package ListenerPattern.formal;
import java.util.EventObject;
public class Event extends EventObject{
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public Event(Object source) {
super(source);
}
}
package ListenerPattern.formal;
public class WashingHandsEvent extends Event {
private String eventName;
public WashingHandsEvent(Object source,String eventName) {
super(source);
this.eventName = eventName;
}
public String getEventName() {
return eventName;
}
public void setEventName(String eventName) {
this.eventName = eventName;
}
}
package ListenerPattern.formal;
import java.util.EventListener;
public interface Listener extends EventListener{
public void fireAfterEventInvoked(Event event);
}
package ListenerPattern.formal;
public class WashingHandsListener implements Listener {
@Override
public void fireAfterEventInvoked(Event event) {
WashingHandsEvent washingHandsEvent = (WashingHandsEvent) event;
System.out.println("饭前准备"+washingHandsEvent.getEventName());
}
}