观察者模式(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)
C#设计模式——观察者模式(Observer Pattern)