Java监听者模式

1. 前言

什么是监听器

监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。。

为什么我们要使用监听器?

监听器可以用来检测网站的在线人数,统计网站的访问量等等!

监听器组件

监听器涉及三个组件:事件源,事件,事件监听器
当事件源发生某个动作的时候,它会调用事件监听器的方法,并在调用事件监听器方法的时候把事件对象传递进去。
我们在监听器中就可以通过事件对象获取得到事件源,从而对事件源进行操作!
在这里插入图片描述

2. 示例

监听器

监听器定义为接口,监听的方法需要事件对象传递进来,从而在监听器上通过事件对象获取得到事件源,对事件源进行修改!


    /**
     * 事件监听器
     *
     * 监听Person事件源的eat和sleep方法
     */
    interface PersonListener{

        void doEat(Event event);
        void doSleep(Event event);
    }

事件源

事件源是一个Person类,它有eat()sleep()方法。事件源需要注册监听器(即在事件源上关联监听器对象),如果触发了eat()sleep()方法的时候,会调用监听器的方法,并将事件对象传递进去。


    /**
     *
     * 事件源Person
     *
     * 事件源要提供方法注册监听器(即在事件源上关联监听器对象)
     */

    class Person {

        //在成员变量定义一个监听器对象
        private PersonListener personListener ;

        //在事件源中定义两个方法
        public void Eat() {

            //当事件源调用了Eat方法时,应该触发监听器的方法,调用监听器的方法并把事件对象传递进去
            personListener.doEat(new Event(this));
        }

        public void sleep() {

            //当事件源调用了Eat方法时,应该触发监听器的方法,调用监听器的方法并把事件对象传递进去
            personListener.doSleep(new Event(this));
        }

        //注册监听器,该类没有监听器对象啊,那么就传递进来吧。
        public void registerLister(PersonListener personListener) {
            this.personListener = personListener;
        }

    }

事件

事件对象封装了事件源,监听器可以从事件对象上获取得到事件源的对象(信息)。


    /**
     * 事件对象Even
     *
     * 事件对象封装了事件源
     *
     * 在监听器上能够通过事件对象获取得到事件源
     *
     *
     */
    class Event{
        private Person person;

        public Event() {
        }

        public Event(Person person) {
            this.person = person;
        }

        public Person getResource() {
            return person;
        }

    }

测试


    public static void main(String[] args) {

        Person person = new Person();

        //注册监听器()
        person.registerLister(new PersonListener() {
            @Override
            public void doEat(Event event) {
                Person person1 = event.getResource();
                System.out.println(person1 + "正在吃饭呢!");
            }

            @Override
            public void doSleep(Event event) {
                Person person1 = event.getResource();
                System.out.println(person1 + "正在睡觉呢!");
            }
        });


        //当调用eat方法时,触发事件,将事件对象传递给监听器,最后监听器获得事件源,对事件源进行操作
        person.Eat();
    }

在这里插入图片描述

3. 总结

  • 事件源:拥有事件
  • 监听器:监听事件源所拥有的事件(带事件对象参数的)
  • 事件对象:事件对象封装了事件源对象

事件源要与监听器有关系,就得注册监听器(提供方法得到监听器对象),触发事件源的事件,实际会提交给监听器对象处理,并且把事件对象传递过去给监听器。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值