addeventlistener怎么监听变量的变化_观察者模式--监听器

a9a58e58fd06bd3fb45a4e463863afd0.png
学习JAVA已经三个月了,到现在才理解观察者模式中监听器的使用,我都怀疑我是不是天资愚钝。

观察者模式:

定义:一个对象的状态发生改变,与此有对应关系的对象将对此作出相应的动作

解释:比如,课堂上,小明突然大声说话,老师作为和小明有对应关系的对象,老师就会把小明扔出去。

看上去,是小明大声说话,老师看到了才把小明扔出去的。其实不然,在观察者模式中,动作对象的相应动作都是被观察对象自己“作”的。

在观察者模式中,我们需要一个监听器,一个被监听的对象,一个事件,一个动作处理器

48bd6e7f305b6d2fca512e52ea9fd799.png

老师,小明,把小明扔出去(处理器)事件的代码如下

/**
 * 说话事件
 */
public class SayEvent {
    private String saySomething = "哈哈哈哈哈哈哈哈";//假设小明只会"哈哈哈哈哈哈哈哈"

    public String getSaySomething() {
        return saySomething;
    }

}


/**
 * 老师
 */
public class Teacher {
    public void doAction() {

    }
}

/**
 * 把小明扔出去
 */
public class ThrowXiaomingOut {

    public void throwXiaoming(Xiaoming xiaoming) {
        System.out.println("老师说:小明滚出去");
    }
}


/**
 * 主人公小明
 */
public class Xiaoming {
    public void doSomething() {
        SayEvent sayEvent = new SayEvent();//开始说话
    }
}

现在我们想想,怎么让老师注意到小明在课堂上叽里呱啦的傻笑呢?并且让告诉老师应该把小明扔出去呢?

第一步,告诉老师,有人在课堂上傻笑应该做的事情(将处理器注入到监听器中)

/**
 * 老师
 */
public class Teacher {
    private ThrowXiaomingOut throwXiaomingOut;

    /**
     * 告诉老师应该把在课堂上傻笑的人扔出去
     * @param throwXiaomingOut 扔出去的处理器
     */
    public void registerDoingSomething(ThrowXiaomingOut throwXiaomingOut) {//在监听器中注册事件处理器
        this.throwXiaomingOut = throwXiaomingOut;
    }

    public void doAction() {
        
    }
}

第二步,老师要做出动作,肯定要有一个触发点,这个触发点是小明在课堂上傻笑,也就是傻笑的这个事件,所以在doAction()这个方法中添加事件这个变量。

 public void doAction(SayEvent sayEvent) {//傻笑的事件
      
 }

老师在得到这个SayEvent 的事件后,就要执行这个事件的处理方法,即调用事件处理器中的throwXiaoming()方法

public void doAction(SayEvent sayEvent) {
        throwXiaomingOut.throwXiaoming(sayEvent.xiaoming);
    }

第三步,傻笑是一个事件,一个事件必须包括人物,也就是做出这件事的主体,我在SayEvent这个class中,增加一个主体字段,也就是小明

/**
 * 说话事件
 */
public class SayEvent {
    public Xiaoming xiaoming;//事件发出的主体,小明

    private String saySomething = "哈哈哈哈哈哈哈哈";//假设小明只会"哈哈哈哈哈哈哈哈"

    public SayEvent(Xiaoming xiaoming) {//在事件的构造方法中传入小明这个对象
        this.xiaoming = xiaoming;
    }

    public String getSaySomething() {
        return saySomething;
    }

}

第四步,老师和小明现在是两个独立的人,我们要给他们建立联系,要让老师能看到小明在课堂上傻笑。所以,我们将老师注入到小明这个对象中

/**
 * 主人公小明
 */
public class Xiaoming {
    private Teacher teacher;

    public void registerTeacher(Teacher teacher) {//将老师注册到小明这个对象中,也就是给被观察对象设置一个监听器
        this.teacher = teacher;
    }


    public void doSomething() {
        
    }
}

第五步,小明要开始作死了。怎么做的呢,小明以自己为主体new了一个事件

public void doSomething() {
        SayEvent sayEvent = new SayEvent(this);//开始说话
        System.out.println(sayEvent.getSaySomething());
        teacher.doAction(sayEvent);//把傻笑的事件做出来给老师看
   }

然后小明把这个事件告诉了老师

 teacher.doAction(sayEvent);//把傻笑的事件做出来给老师看

综上我们就完成了 小明-老师这个观察者模式的试验

运行结果:

小明说:哈哈哈哈哈哈哈哈
老师说:小明滚出去

Process finished with exit code 0

在学习观察者模式中,我觉得 这个监听器,其实应该是倾听器,在老师把小明扔出去的一系列中,是小明 主动 把自己在课堂上傻笑的这个事件通过老师的doAction方法告诉老师(所以我说小明挺作的),老师才对此作出了处理。

如果被倾听者没有主动把这件事告诉倾听器,那么倾听器也无法对事件做出相应的动作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值