前言: 在学习监听器设计模式前最好先学习一下观察者设计模式,因为这两种设计模式有很大的相似之处(两者不属于23种设计模式),可以类比着学习,监听器设计模式要比观察者设计模式要稍微困难一点
监听器的设计模式:类比观察者设计模式:监听器就是观察者,被监听对象就是被观察者。被监听对象的状态发生改变时,会通知监听器,监听器收到通知后会做出相应的处理。
1.被监听者状态的改变被定义为一个对象,称为事件。
2.被监听器对象称为事件源
3.对监听器的通知称为触发监听器
接下来进行逐一定义接口:
①定义事件源接口:
//定义事件源(类似被观察者)
public interface IListenerable{
//注册监听器
void setListener(IListener listener);
//触发监听器
//与被观察模式比较(此时传递的是事件,而不是一个字符串)
void triggerListener(ICurdEvent);
}
②定义事件接口
注意:一般情况下,监听器对象被事件触发后,都会从事件中
获取事件源对象,然后在从事件源中获取一些数据,所以说
一般事件对象中会提供事件源对象的方法(事件对象还可以提
供其它数据,以便监听器获取)
------------------------------------------------
//定义事件接口
public interface ICurdEvent{
//声明事件类型(增删改查)
String CRE_EVENT = "create event";
String UPD_EVENT = "update event";
String RET_EVENT = "retrieve event";
String DEL_EVENT = "delete event";
//获取事件源
IListenerable getEventSource();
//获取事件类型
String getEventType();
}
③:定义监听器接口
public interface IListener{
//处理事件
void handle(ICurdEvent event);
完成对应的实现类
①定义监听器接口的实现类
public class Listener implements IListener {
@Override
public void handle(ICurdEvent event) {
//获取事件的事件类型
String eventType = event.getEventType();
if(ICurdEvent.CRE_EVENT.equals(eventType)) {
System.out.println("监听器执行增加操作");
}else if(ICurdEvent.DEL_EVENT.equals(eventType)) {
System.out.println("监听器执行删除操作");
}else if(ICurdEvent.UPD_EVENT.equals(eventType)) {
System.out.println("监听器执行修改操作");
}else if(ICurdEvent.RET_EVENT.equals(eventType)) {
System.out.println("监听器执行查找操作");
}
}
}
②定义事件源的实现类
public class EventSource 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 deleteStudent(){
//业务逻辑...
//获取事件
ICurdEvent event = new CurdEvent(this,"deleteStu");
this.triggerListener(event);
}
}
③定义事件接口的实现类
//定义事件的实现类
public class CurdEvent implements ICurdEvent {
private IListenerable eventSource;
private String methodName;
//通过构造方法来获取事件类型和事件源对象
public CurdEvent(IListenerable eventSource, String methodName) {
super();
this.eventSource = eventSource;
this.methodName = methodName;
}
@Override
public IListenerable getEventSource() {
//返回事件源对象
return eventSource;
}
@Override
public String getEventType() {
//根据不同的事件类型返回不同的值
String eventType = null;
if(methodName.startsWith("save")) {
eventType = CRE_EVENT;
}else if(methodName.startsWith("delete")) {
eventType = DEL_EVENT;
}else if(methodName.startsWith("update")) {
eventType = UPD_EVENT;
}else if(methodName.startsWith("find")) {
eventType = RET_EVENT;
}else {
eventType = "no this method";
}
return eventType;
}
}
测试类
public class Test {
public static void main(String[] args) {
//定义监听器
IListener listener = new Listener();
//定义事件源
EventSource some = new EventSource();
//注册监听器
some.setListener(listener);
//执行事件源的业务逻辑让相应的监听器做出动作
some.deleteStudent();//执行该逻辑触发监听器
}
}