观察者模式属于行为型模式,指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式。
从字面意思理解,就是我们使用过的发布订阅一样的功能,”牵一发而动多个地方“的时候我们可以使用观察者模式。比如:
1:老师布置家庭作业,所有的学生接收到消息,并且去执行。
2:领导给员工传递会议精神。
3:群发短信功能。
UML图如下文:
1:Observable,抽象类,被观察对象,里面有对观察者的集合操作,通知观察者的操作。
2:ConcreteObservable,具体被观察对象(当然可以和Observable合并成一个类使用)。
3:Observer,抽象类,观察者。
4:ConcreteObserver,具体观察者类。
代码如下:
观察者抽象类:
观察者具体类:
被观察者抽象类:
被观察者具体类:
测试代码:
代码其实很简单:
1:张三李四都是具体的观察者(Observer)
2:张三李四被添加到被观察对象(Observable)集合中
3:在被观察对象(Observable)里面循环去调用张三李四的(notif方法),起到了一个循环通知的作用。
简单代码就实现了发布订阅的功能,这就是我们的观察者模式,是不是很简单?
JDK中的自带的观察者类:
观察者抽象类: java.util.Observer
被观察者对象抽象类: java.util.Observable
观察者抽象类: java.util.Observer 源码
被观察者对象抽象类: java.util.Observable 源码
1: java.util.Observer 源码中,就一个 update(Observable o, Object arg) 方法,可以根据不同的被观察者对象的通知做出更新操作。
2: java.util.Observable 源码,里面有我们的观察者对象集合(Vector),和集合操作方法(add,deleteObserver等等),以及我们通知方法(notify)。
我们直接使用jdk源码写的demo:
具体观察者类(只有一个方法被重写):
具体被观察对象类:
测试:
大家看到这里,有没有发现观察者模式和前面2节中介者模式及其的相似,不论是UML图,还是代码书写(都有集合),我们下节再具体分析两个设计模式的异同点。