监听器设计模式java详解

前言:
在学习监听器设计模式前最好先学习一下观察者设计模式,因为这两种设计模式有很大的相似之处(两者不属于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();//执行该逻辑触发监听器
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值