浅谈监听器模式

监听器模式广泛应用于编程中,例如按钮点击触发音乐播放等。该模式包括事件源、事件对象和监听器三部分。事件源是事件发生的地方,事件对象通常用于包装事件源,而监听器则定义了事件发生后的处理动作。通过添加事件对象、定义监听器和事件源,然后在测试方法中触发事件,监听器即可接收到通知并作出响应。监听器模式与观察者模式类似,不同之处在于回调机制和具体实现方式。

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

监听器模式

  在编程的世界中,监听无所不在,譬如你点击一个音乐播放器的播放按钮,就播放一首音乐;点击相机的拍照按钮,就拍一张照片。也就是你触发某种行为,便会执行具体的动作。
  监听器模式有三个要素——事件源、事件对象、监听器。
事件源: 顾名思义,事件发生的源头,比如点击的按钮,属于被监听的对象;
事件对象: 这个经常和事件源混淆,它经常被用来包装事件源,切记,它毕竟是个事件,比如点击事件,和事件源的区别自己感受,木有栗子;
监听器: 这个是监听器模式的核心,定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参。
第一步,添加事件对象ClickEvent。

package listener;

import java.util.EventObject;

public class ClickEvent extends EventObject {

    private int id;
    public final static int SINGLE_CLICK = 1; //单击事件
    public final static int DOUBLE_CLICK = 2; //双击事件


    public ClickEvent(Object source){
        super(source);
    }

    public ClickEvent(Object source,int id){
        super(source);
        switch(id){
            case SINGLE_CLICK:
                this.id = SINGLE_CLICK;
                break;
            case DOUBLE_CLICK:
                this.id = DOUBLE_CLICK;
                break;
        }
    }

    public int getId(){
        return this.id;
    }
}

第二步,定义一个时间监听器OnClickListener。

package listener;

import java.util.EventListener;

//监听器必须要集成EventListener,这个是默认继承的。
public interface OnClickListener extends EventListener {

    void click(ClickEvent clickEvent);
    void doubleClick(ClickEvent clickEvent);
}

第三步,定义一个事件源Button。

package listener;

import java.util.EventObject;

public class Button {

    private OnClickListener clickListener;

    public void setClickListener(OnClickListener clickListener){
        this.clickListener = clickListener;
    }

    public void handleEvent(EventObject e) {
        if (e instanceof ClickEvent) {
            ClickEvent event = (ClickEvent)e;
            switch(event.getId()){
                case ClickEvent.SINGLE_CLICK:
                    this.clickListener.click(event);
                    break;
                case ClickEvent.DOUBLE_CLICK:
                    this.clickListener.doubleClick(event);
                    break;
            }
        }
    }
}

第四步,添加一个事件源产生的对象。

package listener;

public class EventSource implements OnClickListener {

    public Button testOnClick() {
        final Button button = new Button();
        button.setClickListener(this);
        return button;
    }

    @Override
    public void click(ClickEvent clickEvent) {
        System.out.println("鼠标单击事件: " + clickEvent.getId());
    }

    @Override
    public void doubleClick(ClickEvent clickEvent) {
        System.out.println("鼠标双击事件: " + clickEvent.getId());
    }
}

第五步,添加测试方法。

package listener;

public class Main {

    public static void main(String[] args) {
        final EventSource eventSource = new EventSource();
        Button button = eventSource.testOnClick();
        ClickEvent clickEvent = new ClickEvent(EventSource.class, ClickEvent.SINGLE_CLICK);
        button.handleEvent(clickEvent);
    }
}

第六步,输出

鼠标单击事件: 1

  监听器监听自己感兴趣的事件,一旦该事件被触发或改变,立即得到通知,做出响应,监听器一般是接口,用来约定调用的方式。当事件源对象上发生操作时,它会将调用事件监听器的一个方法,并在调用该方法时传递事件对象过去。事件监听器实现类通常是由开发人员编写,开发人员通过事件对象拿到事件源,从而对事件源上的操作进行处理。
  观察者模式原理和监听器一样的,使用的关键在搞清楚什么是观察者、什么是被观察者。观察者(Observer)相当于事件监听器。被观察者(Observable)相当于事件源和事件,执行事件源通知逻辑时,将会回调Observer的回调方法update,只是在观察者模式中常用的是反射,而在监听器模式中使用的是callback。

浅谈状态模式
浅谈建造者模式
浅谈工厂模式
浅谈代理模式
浅谈适配器模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值