1. 传统观察者模式
这是设计模式中的一种,举一个不恰当的例子,一个老师,盯着3个学生做作业。每当一个孩子做完作业,老师都要去及时的批改作业。
这其中就存在二个对象:
1,观察者对象:就是老师
2,被观察对象(受查者):被监听的三个倒霉孩子
实现:
1 | import java.util.Observable; |
观察者(theather)重写Observer接口,被观察者(student) 继承Observable。
触发notifyObservers 父类方法通知观察者。setChanged方法,表明内容有变化,不调用则不会通知。为开关方法。
2. 监听模式
设计模式中的一种,还是已上面那个例子为准。老师盯着三个孩子写作业,每当孩子完成作业都要通知老师来检查。
定义:事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法
我们拆分一下对象,存在3个对象
1,事件源:老师
2,监听器:老师监听作业完成情况
3, 事件:学生
###实现:
1 | import java.util.Enumeration; |
监听器模式是观察者模式的另一种形态,同样基于事件驱动模型。监听器模式更加灵活,可以对不同事件作出相应。但也是付出了系统的复杂性作为代价的,因为我们要为每一个事件源定制一个监听器以及事件,这会增加系统的负担。 监听器可以实现多个时间的监控,及抽象扩展性非常的灵活。
##guava 中的观察者模式
1.简单方法
还是一样的定义,我们实现老师监控学生写作业。
1 | import java.util.HashSet; |
1,相对于jdk中提供的观察者方法,guava中不需要继承接口,没有代码侵入性。干净且利于理解。
2,guava 使用注解@Subscribe可以自定义监听器的监听方法,可以同时实现多个事件的监听。
2, Event的继承
如果Listener A监听Event A, 而Event A有一个子类Event B, 此时Listener A将同时接收Event A和B消息,实例如下:
1 | import java.util.HashSet; |
就写到这里,基本操作就是这样。这个设计模式在很多地方都可以用到,想到了一句话叫暗中观察。。。