思想
一个被监听者对应着多个监听器,当被监听者执行某个触发事件后,就会触发对应的监听器,执行对应的操作。
具体实例
接口
触发事件接口
public interface ICurdEvent {
//声明事件类型、
String CRE="create";
String UPD="update";
//获取事件源对象
IListenerable getEventSource();
//获取事件类型
String getEventType();
}
监听器接口
监听器接口应该有的功能就是处理事件
public interface IListener {
//处理事件
void handle(ICurdEvent event);
}
被监听者
也叫事件源接口,事件源应该有的功能是注册监听器和根据事件触发监听器
public interface IListenerable {
//注册监听器
void setListener(IListener listener);
//触发监听器
void triggerListener(ICurdEvent event);
}
实现类
触发事件实现类
public class CurdEvent implements ICurdEvent {
//事件源
private IListenerable eventSource;
//事件源执行的方法名称
private String methodName;
public CurdEvent(IListenerable eventSource,String methodName) {
this.eventSource = eventSource;
this.methodName=methodName;
}
//获取事件源对象
@Override
public IListenerable getEventSource() {
return eventSource;
}
//获取事件类型
@Override
public String getEventType() {
String eventType=null;
if(methodName.startsWith("sava")){
eventType=CRE;
}else {
eventType=UPD;
}
return eventType;
}
}
监听器实现类
public class CurdListener implements IListener {
//处理事件
@Override
public void handle(ICurdEvent event) {
String eventType=event.getEventType();
if(ICurdEvent.CRE.equals(eventType)){
System.out.println("添加");
}else {
System.out.println("更新");
}
}
}
被监听者实现类
public class Some implements IListenerable {
private IListener listener;
//注册监听器
@Override
public void setListener(IListener listener) {
this.listener=listener;
}
//触发监听器
@Override
public void triggerListener(ICurdEvent event) {
listener.handle(event);
}
//执行操作,触发对应事件
public void saveStudent(){
System.out.println("保存学生数据");
ICurdEvent event=new CurdEvent(this,"saveStudent");
this.triggerListener(event);
}
public void updateStudent(){
System.out.println("更新学生数据");
ICurdEvent event=new CurdEvent(this,"updateStudent");
this.triggerListener(event);
}
}
测试类
public class Test {
public static void main(String[] args) {
//定义事件源
Some some=new Some();
//定义监听器
IListener listener=new CurdListener();
//事件源注册监听器
some.setListener(listener);
some.saveStudent();
some.updateStudent();
}
}