观察者模式是对象行为模式中的一种,在平时项目中经常被用来解耦对象之间的依赖。

观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并自动更新。别名:Dependents(依赖),源-监听,发布-订阅(Publish-subscribe)。

参与者:

(1)Subject(抽象目标角色):提供注册和删除观察者对象的接口,知道它的观察者。可以有任意多个观察者观察同一个目标。

(2)Observer(观察者角色):为那些在目标发生改变时需要更新的对象定义一个更新接口。

(3)ConcreteSubject(具体目标):将有关状态存入ConcreteObserver对象,当它的状态发生改变时,向它的各个观察者发出通知。

(4)ConcreteObserver(具体观察者):维护一个指向ConcreteSubject对象的引用,存储有关状态,这些状态应与目标状态保持一致,实现Observer的更新接口,以使自己状态与目标状态保持一致。

Java1.0中java.util.Observable抽象了被观察者,抽象目标角色,里面有添加、删除观察者、通知观察者方法,java.util.Observer接口抽象了观察者角色,具体观察者要实现里面abstract void update(Observable paramObservable, Object paramObject)方法,根据被观察者状态更新自己的状态。

在Java1.1后又抽象了事件监听模型,用java.util.EventObject抽象了事件对象,java.util.EventListener抽象了事件监听器对象,用户根据需要自己抽象事件源(相当于被观察者),扩展了观察者模式的功能,可以更好解决现实生活中多个事件源产生相同事件,一个事件源产生多个事件的问题。Spring的事件机制也是通过继承它们实现。

监听器模式与职责链模式的一个差异是前者多个监听器处理逻辑互不影响,后者是击鼓传花,根据自己职责处理后决定是否继续传下去,适用于工作流。

说说Java观察者模式的更多相关文章

  1. 用Spring提高java观察者模式灵活性

    在上篇博客 用java观察者模式解耦经典三层架构 的最后,用了一个Client类把Listener的实现类注冊到了LoginEventSource类中,假设须要加入�新的逻辑,加入�新的listene ...

  2. java: 观察者模式:Observable被观察者,Observer观察者

    java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...

  3. java观察者模式

      像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...

  4. Java——观察者模式实例

    观察者模式(订阅/发布模式) 作者: 代码大湿 代码大湿 Java中观察者模式中主要是Observerable类(被观察者),和Observer接口(观察者).下面是个简单的demo //被观察者 p ...

  5. java 观察者模式 与spring配置

    一.Observer模式的意图: 在对象的内部状态发生变化时,自动通知外部对象进行响应. 二.Observer模式的构成: ·被观察者:内部状态有可能被改变,而且又需要通知外部的对象 ·观察者:需要对 ...

  6. Java观察者模式(Observer)

    一.定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己.主要应用在java的AWT事件机制 ...

  7. java 观察者模式

    /** 抽象的观察者 */ public interface Watcher { // status 为 被被观察着传递过来的状态 public void update(String status); ...

  8. Java观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

  9. java观察者模式的实现

    在看博客里,有个订阅功能,当你订阅后,当博主发布新的博客,你都能收到消息.这是如何实现的?是不是后台有个线程在不停的轮询?如果是这样的话,显然太耗资源,如果当博客在发布时,找到所有的订阅者,然后循环的 ...

随机推荐

  1. linux基础知识汇总

    1.如何快速回到上次操作的目录? cd - 2.如何快速回到家目录? 直接cd或者cd ~ 3.怎么回到上一级目录? cd .. 4.什么是相对路径,什么是绝对路径? 相对路径就是相对于当前目录的位置 ...

  2. msp430项目编程03

    msp430中项目---液晶12864显示 1.液晶12864工作原理 2.电路原理说明 3.代码(静态显示) 4.代码(动态显示) 5.项目总结 msp430项目编程 msp430入门学习

  3. 利用PHP SOAP实现WEB SERVICE[转载]

    php有两个扩展可以实现web service,一个是NuSoap,一个是php 官方的soap扩展,由于soap是官方的,所以我们这里以soap来实现web service.由于默认是没有打开soa ...

  4. HDU 5667 Sequence

    指数有递推式,可以通过矩阵快速幂来求解.再用下面这公式快速幂取模即可. (C是素数) #include<cstdio> #include<cstring> #include&l ...

  5. 碧砚适合佳能328 4452 ICD520 4472 4450 硒鼓4700一体机墨盒4770

  6. Myeclipse配置jad

    下载地址:http://pan.baidu.com/s/1bnpMEuF 1.下载jad158g.win.zip 下载后解压.解压缩后将jad.exe拷贝到自定义的文件夹内:我这里用的是D:/jad/ ...

  7. 【Nginx】定时器事件

    转自:烟雨江南 Nginx事件管理主要是网络事件和定时器事件.下面介绍定时器事件管理,即超时管理. 为什么进行超时管理? Nginx有必要对可能发生超时的事件 进行统一管理,并在事件超时时作出相应的处 ...

  8. 运行mapreduce - java.lang.InterruptedException

    错误日志: 2018-11-19 05:23:51,686 WARN [main] util.NativeCodeLoader (NativeCodeLoader.java:<clinit> ...

  9. [RxJS] Create a Reusable Operator from Scratch in RxJS

    With knowledge of extending Subscriber and using source.lift to connect a source to a subscriber, yo ...

  10. VB6 如何自定义代码字体和支持鼠标滚轮

    1 点击工具-选项-编辑器格式,把代码改成需要的字体和大小.(一般微软雅黑,16号字体比较好)   2 从以下网站下载VB6增强工具,可以支持鼠标滚轮代替右侧滚动条查看代码,按F3还可以切换代码窗口和 ...