观察者模式(Observer)的推式与拉式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式(Observer)的推式与拉式相关的知识,希望对你有一定的参考价值。

参考技术A

当我们想订一份报纸,我们先去邮局找到报纸的编号后填写订阅单并缴费。当报社有新报纸发出时,邮局会将我们订阅的报纸发给我们。
为了简单我们去掉邮局环节简化成:报社有新报纸后马上通知用户,这就是观察者。
定义对象间的一对多关系,当一个对象的状态发生变化时,所依赖于它的对象都得到通知并主动更新。 在观察者模式中,多个订阅者成为观察者(Observer),被观察的对象成为目标(Subject)。观察者的UML模型如下:

先定义Subject并写一个ConcreteSubject继承Subject:

再定义一个接口Observer,并写一个ConcreteObserver实现Observer接口:

最后看看主函数方法:

打印出来的结果:

在实现观察者模式的时候,一定要注意触发通知的时机。一般情况下是在完成了状态改变之后触发,因为通知会传递数据,比如在 setSubjectState 时先通知观测者就会发生 错误

在观察者模式的实现上,有推模式和拉模式两种方式:

当前上面的实现使用的就是拉模型。通过 (ConcreteSubject)subject 得到具体对象,获得信息。

当然Java本身就有观察者模式的部分实现,分别是 java.util.Observable java.util.Observable 。
下面看一个使用Java自带观察者模式的例子:

新的目标直接继承Java中定义的Observerable:

新的观察者也直接实现Observer接口:

主函数和前面的相似:

打印出结果:

使用Java自带的观察者模式需要注意以下几个问题:

以上是关于观察者模式(Observer)的推式与拉式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之二:观察者模式(Observer Pattern)

是否可以使用 REST API 实现观察者模式

C#设计模式——观察者模式(Observer Pattern)

Java中使用Observer接口和Observable类实践Observer观察者模式

观察者模式(Observer)

09观察者模式ObServer