监听器和观察者模式差不多,监听器是通过监听事件源,当事件源发生的事件,根据事件类型进行相应的处理。
直接上代码,直观清晰。
定义事件源:事件源需要绑定一个监听器,并且当本身发生改变时可以触发监听器。
package listen; //定义事件源 public interface IListenerable { //注册监听器 void registerListener(IListener listener); //根据发生的事件触发监听器 void triggerListener(IEvent event); }
package listen; public class Listenerable implements IListenerable { //声明监听器的引用。 private IListener listener; //注册一个监听器 @Override public void registerListener(IListener listener) { this.listener=listener; } //触发监听器 @Override public void triggerListener(IEvent event) { listener.handEvent(event); } //本身的业务逻辑方法。 public void clickMethod(){ System.out.println("谁按了我");
//产生事件 IEvent event=new Event(this,"click");
//触发监听器 this.triggerListener(event); } public void changeMethod(){ System.out.println("谁改变了我"); IEvent event=new Event(this,"change"); this.triggerListener(event); } }
定义事件:事件是事件源发生的,所以它能够拿到对应事件源以及事件源发生的事件类型。
package listen; //定义事件 public interface IEvent { //定义事件类型 String CLICK="click"; //在接口中默认为 public static 修饰 String CHANGE="change"; //获取事件源 IListenerable getListenerable();//在接口中默认为 public abstract 修饰 //获取事件类型 String getEventType(); }
package listen; public class Event implements IEvent { //事件源的引用 private IListenerable listenerable; //事件源执行的处理业务的方法名 private String excuteMethod; //生成事件时直接绑定对应的事件源以及事件源执行的方法。 public Event(IListenerable listenerable, String excuteMethod) { this.listenerable = listenerable; this.excuteMethod = excuteMethod; } //获取事件源 @Override public IListenerable getListenerable() { // TODO Auto-generated method stub return listenerable; } //根据事件源执行的业务方法绑定对应的事件类型。 @Override public String getEventType() { String eventType=null; if(excuteMethod.startsWith(IEvent.CLICK)){ eventType=IEvent.CLICK; }else if(excuteMethod.startsWith(IEvent.CHANGE)){ eventType=IEvent.CHANGE; } return eventType; } }
定义监听器:
package listen; //定义监听器 public interface IListener { //处理事件 void handEvent(IEvent event); }
package listen; public class Listener implements IListener { //根据事件类型进行相应的处理。 @Override public void handEvent(IEvent event) { String type=event.getEventType(); if(IEvent.CLICK.equals(type)){ System.out.println("触发了点击事件"); }else if(IEvent.CHANGE.equals(type)){ System.out.println("触发了改变事件"); } } }
测试:
package listen; public class Test { public static void main(String[] args) { //声明监听器 IListener listener=new Listener(); //声明事件源 Listenerable listenerable=new Listenerable(); //事件源注册监听器 listenerable.registerListener(listener); //事件源执行业务方法。 listenerable.clickMethod(); listenerable.changeMethod(); } }
结果:
谁按了我 触发了点击事件 谁改变了我 触发了改变事件
浙公网安备 33010602011771号