业务逻辑:孩子在吃饭前需要洗手,所以我们需要监听孩子的吃饭事件,当吃饭事件发生时,执行监听事件
1 孩子类
package listen;
import java.util.ArrayList;
import java.util.List;
public class Child {
private String name;
private List listeners = new ArrayList();
//为该对象注册监听
public void addListener(Listener listener) {
this.listeners.add(listener);
}
public void eat() {
//遍历监听集合
for(Listener listener : listeners) {
//对相应的监听执行不同的逻辑
if(listener instanceof RemaindWashListener) {
RemaindWashListener washingHandsListener = (RemaindWashListener)listener;
//调用监听中的处理方法
washingHandsListener.fireAfterEventInvoked(new WashingHandsEvent(this,"洗手"));
}
}
System.out.println("吃饭");
}
}
2 事件类
package listen;
import java.util.EventObject;
public class Event extends EventObject{
/**
*
*/
private static final long serialVersionUID = 1L;
/**
*
* source 为事件源对象,在此示例中就是Child对象
* @param source
*/
public Event(Object source) {
super(source);
}
}
3 事件接口实现类
package listen;
public class WashingHandsEvent extends Event{
private String eventName;
/**
*
*/
private static final long serialVersionUID = 1L;
public WashingHandsEvent(Object source,String eventName) {
super(source);
this.eventName = eventName;
}
public String getEventName() {
return eventName;
}
public void setEventName(String eventName) {
this.eventName = eventName;
}
}
4 监听器接口
package listen;
import java.util.EventListener;
public interface Listener extends EventListener{
public void fireAfterEventInvoked(Event event);
}
5 监听器实现
package listen;
public interface RemaindWashListener extends Listener{
/**
* 监听器实现类型
* 1、可以将方法的具体实现写在改实现类中,
* 2、也可以将该类定义为接口,在调用的时候再用内部类的方式来写具体实现。(对于调用者实现比较灵活)
* 本示例用的是第二种
*/
public void fireAfterEventInvoked(Event event); /*{
WashingHandsEvent WashingHandsEvent = (WashingHandsEvent)event;
System.out.println("饭前需要"+WashingHandsEvent.getEventName());
}
*/
}
6 main测试类
package listen;
import java.util.ArrayList;
import java.util.List;
public class TestMain {
public static void main(String[] args) {
Child child = new Child();
//在被监听对象中注册监听
child.addListener(new RemaindWashListener() {//实现监听类抽象接口和方法具体实现
@Override
public void fireAfterEventInvoked(Event event) {
System.out.println("吃饭前洗手");
}
});
child.eat();
}
}
7 演示结果
图片.png