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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容