你不知道哪天妈妈会让你做作业,然后你就一直等待,直到有一天老师让你做作业了,通知了你,你就拿笔开始了你鬼画桃符。这就是一个观察者模式的体现。(最讨厌写作业)
接下来我们用代码来解决这个问题。
UML
使用场景
-
关联行为场景,关联行为可拆分,非聚合关系
-
事件多级触发场景
-
跨系统消息交换,如消息队列、事件总线的处理机制
-
先创建Mather,继承子Observable(java中携带有的被观察者类,比较方便,使用它来介绍)
事例
/**
* 被观察者
*/
public class Mather extends Observable {
public Mather() {
}
/**
* 方法:通知观察者做作业了
*/
public void notify2XiaoMing() {
//设置改变了,然后再通知观察者们
setChanged();
notifyObservers("该做作业了");
}
}
- 再创建小明
/**
* 小明
*/
public class XiaoMing implements Observer {
public XiaoMing() {
}
/***
* 观察者接口回调,有改变的时候会回调
* @param o 被观察者对象,一个观察者可以注册多个被观察者,用这个区分
* @param arg 消息
*/
@Override
public void update(Observable o, Object arg) {
System.out.println(o + ":" + arg);
}
}
- 测试类
public class ObserTest {
public static void main(String[] args) throws CloneNotSupportedException {
//创建观察者
XiaoMing xiaoMing = new XiaoMing();
//创建被观察者并添加到观察者中
//利用Observable自带的添加方法,内部是添加到一个列表中
father.addObserver(xiaoMing);
//通知
father.notify2XiaoMing();
}
}
总结:
观察者大致流程就是:
- 观察者注册到被观察者中
- 被观察者有变化的时候,使用注册引用来通知到观察者
平时咱们使用接口注册监听回调自然就是一种观察者模式利用的体现,RxJava系列是对观察者用的非常好,有兴趣可以搜索一下解析的,网上挺多。Android中adapter的notify也是观察者模式的体现哦