监听器和观察者模式差不多,监听器是通过监听事件源,当事件源发生的事件,根据事件类型进行相应的处理。

直接上代码,直观清晰。

定义事件源:事件源需要绑定一个监听器,并且当本身发生改变时可以触发监听器。

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

结果:

谁按了我
触发了点击事件
谁改变了我
触发了改变事件

 

posted on 2018-06-28 16:38  王衙内  阅读(190)  评论(0)    收藏  举报