![a9a58e58fd06bd3fb45a4e463863afd0.png](https://img-blog.csdnimg.cn/img_convert/a9a58e58fd06bd3fb45a4e463863afd0.png)
学习JAVA已经三个月了,到现在才理解观察者模式中监听器的使用,我都怀疑我是不是天资愚钝。
观察者模式:
定义:一个对象的状态发生改变,与此有对应关系的对象将对此作出相应的动作
解释:比如,课堂上,小明突然大声说话,老师作为和小明有对应关系的对象,老师就会把小明扔出去。
看上去,是小明大声说话,老师看到了才把小明扔出去的。其实不然,在观察者模式中,动作对象的相应动作都是被观察对象自己“作”的。
在观察者模式中,我们需要一个监听器,一个被监听的对象,一个事件,一个动作处理器
![48bd6e7f305b6d2fca512e52ea9fd799.png](https://img-blog.csdnimg.cn/img_convert/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方法告诉老师(所以我说小明挺作的),老师才对此作出了处理。
如果被倾听者没有主动把这件事告诉倾听器,那么倾听器也无法对事件做出相应的动作