Android技术知识JavaJava 杂谈

java设计模式-观察者模式(Observer)

2019-08-20  本文已影响38人  yiqiquhuxi

观察者模式属于行为型模式,指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式。

从字面意思理解,就是我们使用过的发布订阅一样的功能,”牵一发而动多个地方“的时候我们可以使用观察者模式。比如:
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图,还是代码书写(都有集合),我们下节再具体分析两个设计模式的异同点。

上一篇下一篇

猜你喜欢

热点阅读