监听器Listener学习笔记1:监听器设计模式
程序员文章站
2022-06-02 20:12:31
...
1.理论知识
监听器设计模式,是观察者设计模式的一种实现,它不属于23种设计模式之一
监听器设计模式的一个被观察者一般定义一个观察者,也可以定义多个观察者。被监听者发送的信息是一个对象,叫做事件。被监听对象称为事件源。对监听器发送通知叫做触发监听器。
2.示例代码
以被监听者所执行的增删改查crud操作进行监听为例
事件接口的代码
package com.powernode.events;
import com.powernode.listenerable.IListenerable;
//定义增删改查事件
//C:create
//R:Retrieve 检索
//U:update
//D:delete
//通常,对于事件对象,我们一般是需要从事件对象中获取到事件源对象
public interface ICrudEvent {
//声明事件类型
String CRE_EVENT="create event";
String RET_EVENT="retrieve event";
String UPD_EVENT="update event";
String DEL_EVENT="delete event";
//获取事件源对象
IListenerable getEventSource();
//获取事件类型
String getEventType();
}
事件源接口的代码
package com.powernode.listenerable;
import com.powernode.events.ICrudEvent;
import com.powernode.listeners.IListener;
//事件源接口
public interface IListenerable {
//为事件源注册监听器
void setListener(IListener listener);
//触发监听器
void triggerListener(ICrudEvent event);
}
监听器接口的代码
package com.powernode.listeners;
import com.powernode.events.ICrudEvent;
//监听器接口
public interface IListener {
//处理事件
void handle(ICrudEvent event);
}
事件的实现类
package com.powernode.events;
import com.powernode.listenerable.IListenerable;
//定义事件类
public class CrudEvent implements ICrudEvent {
private IListenerable eventSource; //事件源
private String methodName; //事件源所执行的方法名称
public CrudEvent(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("remove")) {
eventType=DEL_EVENT;
}else if (methodName.startsWith("modify")) {
eventType=UPD_EVENT;
}else if (methodName.startsWith("retrieve")) {
eventType=RET_EVENT;
}else {
eventType="have not this event type";
}
return eventType;
}
}
监听器的类
package com.powernode.listeners;
import com.powernode.events.ICrudEvent;
//定义监听器类
public class CrudListener implements IListener {
@Override
public void handle(ICrudEvent event) {
String eventType=event.getEventType();
if (ICrudEvent.CRE_EVENT.equals(eventType)) {
System.out.println("事件源执行了 添加 操作");
} else if (ICrudEvent.DEL_EVENT.equals(eventType)) {
System.out.println("事件源执行了 删除 操作");
}else if (ICrudEvent.UPD_EVENT .equals(eventType)) {
System.out.println("事件源执行了 修改 操作");
}else if (ICrudEvent.RET_EVENT.equals(eventType)) {
System.out.println("事件源执行了 查询 操作");
}
}
}
事件源的类
package com.powernode.listenerable;
import com.powernode.events.ICrudEvent;
import com.powernode.listeners.IListener;
//定义事件源类
public class Some implements IListenerable {
private IListener listener;
//注册监听器
@Override
public void setListener(IListener listener) {
this.listener=listener;
}
//触发监听器
@Override
public void triggerListener(ICrudEvent event) {
listener.handle(event);
}
}
测试代码
package com.powernode.test;
import com.powernode.events.CrudEvent;
import com.powernode.events.ICrudEvent;
import com.powernode.listenerable.Some;
import com.powernode.listeners.CrudListener;
import com.powernode.listeners.IListener;
public class MyTest {
public static void main(String[] args) {
//定义监听器
IListener listener=new CrudListener();
//定义事件源
Some some=new Some();
//定义事件
ICrudEvent event=new CrudEvent(some, "saveStudent");
//注册监听器
some.setListener(listener);
//触发监听器
some.triggerListener(event);
}
}
更真实的监听器
事件源的代码
package com.powernode.listenerable;
import com.powernode.events.CrudEvent;
import com.powernode.events.ICrudEvent;
import com.powernode.listeners.IListener;
//定义事件源类
public class Some implements IListenerable {
private IListener listener;
//注册监听器
@Override
public void setListener(IListener listener) {
this.listener=listener;
}
//触发监听器
@Override
public void triggerListener(ICrudEvent event) {
listener.handle(event);
}
//下面的方式是事件源类真正的业务逻辑,而监听器监听的就是这些业务方法的执行
public void saveStudent() {
System.out.println("向DB中添加了一条数据");
ICrudEvent event =new CrudEvent(this, "saveStudent");
this.triggerListener(event);
}
public void deleteStudent() {
System.out.println("向DB中 删除 了一条数据");
ICrudEvent event =new CrudEvent(this, "deleteStudent");
this.triggerListener(event);
}
public void updateStudent() {
System.out.println("向DB中 修改 了一条数据");
ICrudEvent event =new CrudEvent(this, "updateStudent");
this.triggerListener(event);
}
public void findStudent() {
System.out.println("向DB中 查询 了一条数据");
ICrudEvent event =new CrudEvent(this, "findStudent");
this.triggerListener(event);
}
}
测试代码
package com.powernode.test;
import com.powernode.events.CrudEvent;
import com.powernode.events.ICrudEvent;
import com.powernode.listenerable.Some;
import com.powernode.listeners.CrudListener;
import com.powernode.listeners.IListener;
public class MyTest {
public static void main(String[] args) {
//定义监听器
IListener listener=new CrudListener();
//定义事件源
Some some=new Some();
//定义事件
ICrudEvent event=new CrudEvent(some, "saveStudent");
//注册监听器
some.setListener(listener);
//事件源执行自己的业务方法
some.saveStudent();
some.deleteStudent();
some.updateStudent();
some.findStudent();
}
}
上一篇: 达梦数据库数据泵使用简介