监听器Listener学习笔记1:监听器设计模式

本文介绍了监听器设计模式,作为观察者设计模式的一种实现,它涉及到被观察者定义多个观察者并发送事件对象。文章通过增删改查操作的示例,详细展示了事件接口、事件源接口、监听器接口的代码实现,以及相关的事件源类和监听器类的测试代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
	
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值