监听器模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

监听器模式三要素——事件源,事件对象,监听器
事件源:事件发生的源头,比如按钮,属于被监听的事件触发源;
事件对象:这个经常和事件源混淆,它是事件源触发的一个动作,比如点击事件,按钮点击后触发的一个事件;
监听器:这个是监听器模式的核心,定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参。


下面简单举个例子说明

故事背景:小雨走在路上,失控的汽车撞向小雨,小雨拥有蜘蛛感应弱化版,身手敏捷的他直接闪开了。
先定义一个监听器,走流程,先来个接口

public interface Listener extends EventListener {
    void actionInvoke(Event event);
}

监听到事件后,触发一个闪身的动作

public class TargetListener implements Listener{
    @Override
    public void actionInvoke(Event event) {
     if(event instanceof HitEvent){
            HitEvent hitEvent = (HitEvent) event;
            System.out.println(hitEvent.getCarHit());
            System.out.println("作为敏捷满级选手,我闪~~~");
        }
    }
}

定义一个事件,用于被继承

public class Event extends EventObject {
    /**
     * Constructs a prototypical Event.
     *
     * @param source The object on which the Event initially occurred.
     * @throws IllegalArgumentException if source is null.
     */
    public Event(Object source) {
        super(source);
    }
}

定义单个汽车撞击的事件,写入触发事件的事件源

public class HitEvent extends Event{
    private String carHit;
    /**
     * Constructs a prototypical Event.
     *
     * @param source The object on which the Event initially occurred.
     * @throws IllegalArgumentException if source is null.
     */
    public HitEvent(Object source,String eventName) {
        super(source);
        this.carHit = eventName;
    }

    public String getCarHit() {
        return carHit;
    }

    public void setCarHit(String carHit) {
        this.carHit = carHit;
    }
}

定义事件源,事件源需要添加监听器,并且有相应的触发事件的方法

public class People {
    private String name;
    private List<Listener> listenerList = new ArrayList<>();

    public People(String name) {
        this.name = name;
    }

    public void addListeners(Listener listener){
        listenerList.add(listener);
    }

    //事件源触发事件的动作
    public void walk(){
        //添加点文字,显示下动作
        System.out.println("小雨在路上走着");
        for (Listener listener : listenerList) {
            if(listener instanceof TargetListener){
                TargetListener targetListener = (TargetListener) listener;
                //监听器监听事件,失控的汽车撞向行人这个时间发生时,触发
                targetListener.actionInvoke(new HitEvent(this, "失控的汽车撞向行人"));
            }
        }
    }
}

写个测试类

public class Test {
    public static void main(String[] args) {
        People people = new People("小雨");
        people.addListeners(new TargetListener());
        people.walk();
    }
}

测试结果如下
测试结果

总结

如果觉得内容尚可,请给个赞,如果内容有问题,请在评论简要指出,共同进步,蟹蟹^^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值