`
crazyox
  • 浏览: 185024 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式之Observer

阅读更多

观察者模式又被称为依赖(Dependents)或发布-订阅模式(Publish-Subscribe).

意图:  定义对象间的一种一对多的依赖关系, 当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.

问题: 当某个事件发生时,你需要相一系列对象发出通知, 而这个对象的列表是变化的.

实现:

  1.  让"希望知道某个事件何时发生"的对象(Observer)将自己注册到另一个"监视时间发生或自己触发事件"的对象(Subject)上.
  2.  当事件发生时, Subject 告诉 Observer "你关心的事件已经发生了"
  3.  为了能让所有的观察者型对象实现Observer接口,有时候需要使用Adapter模式.

示意图:

示例:

在Java包中容纳了Oberver模式的一个实现版本.Observable类和Observer接口组成了这个模式. Observable类扮演了Subject的角色,是被观察者, Observer是观察者的超类.


主题(被观察者):

java 代码
  1. public class Observable {   
  2.     private boolean changed = false;   
  3.     //保存所有观察者   
  4.     private Vector obs;   
  5.       
  6.     public Observable() {   
  7.  obs = new Vector();   
  8.     }   
  9.     //注册一个观察者   
  10.     public synchronized void addObserver(Observer o) {   
  11.         if (o == null)   
  12.             throw new NullPointerException();   
  13.  if (!obs.contains(o)) {   
  14.      obs.addElement(o);   
  15.  }   
  16.     }   
  17.     //移除一个观察者   
  18.     public synchronized void deleteObserver(Observer o) {   
  19.         obs.removeElement(o);   
  20.     }   
  21.     //如果状态改变通知所有观察者   
  22.     public void notifyObservers() {   
  23.  notifyObservers(null);   
  24.     }   
  25.     //如果状态改变通知某个观察者   
  26.     public void notifyObservers(Object arg) {   
  27.  /*  
  28.          * a temporary array buffer, used as a snapshot of the state of  
  29.          * current Observers.  
  30.          */  
  31.         Object[] arrLocal;   
  32.   
  33.  synchronized (this) {   
  34.      /* We don't want the Observer doing callbacks into  
  35.       * arbitrary code while holding its own Monitor.  
  36.       * The code where we extract each Observable from   
  37.       * the Vector and store the state of the Observer  
  38.       * needs synchronization, but notifying observers  
  39.       * does not (should not).  The worst result of any   
  40.       * potential race-condition here is that:  
  41.       * 1) a newly-added Observer will miss a  
  42.       *   notification in progress  
  43.       * 2) a recently unregistered Observer will be  
  44.       *   wrongly notified when it doesn't care  
  45.       */  
  46.      if (!changed)   
  47.                 return;   
  48.             arrLocal = obs.toArray();   
  49.             clearChanged();   
  50.         }   
  51.   
  52.         for (int i = arrLocal.length-1; i>=0; i--)   
  53.             ((Observer)arrLocal[i]).update(this, arg);   
  54.     }   
  55.     //移除所有观察者   
  56.     public synchronized void deleteObservers() {   
  57.  obs.removeAllElements();   
  58.     }   
  59.     //设置状态改变   
  60.     protected synchronized void setChanged() {   
  61.  changed = true;   
  62.     }   
  63.     //设置状态未改变   
  64.     protected synchronized void clearChanged() {   
  65.  changed = false;   
  66.     }   
  67.     //判断状态是否改变   
  68.     public synchronized boolean hasChanged() {   
  69.  return changed;   
  70.     }   
  71.     //得到观察者数量   
  72.     public synchronized int countObservers() {   
  73.  return obs.size();   
  74.     }   
  75. }   

观察者超类:

java 代码
  1.   
  2. public interface Observer {   
  3.     void update(Observable o, Object arg);   
  4. }   

观察者扩展类:

java 代码
  1.   
  2. public class Observer1 implements Observer {   
  3.     //注册观察主题, 这个可以在超类中实现   
  4.     public void Observer1(){   
  5.         Observable observable = new Observable();   
  6.         observable.addObserver(this);   
  7.     }   
  8.     void update(Observable o, Object arg){   
  9.         //do our bussiness ......   
  10.         System.out.println("O has changed, I get it!");    
  11.      }   
  12. }   

 

示例2: 

        有一个系统, 不定时的收到很多信息,如天气预报, 体育新闻, 国际新闻, 最新歌曲等, 每次有新的信息到达时, 系统将这些信息发送给不同的订阅客户,这些客户都订阅了这些主题中的一个或多个. 客户也可以选择订阅和退定. 

这是一个典型的订阅/发布系统: 这些不同信息就相当于不同的主题(Subject), 不同内容的订阅客户就相当于观察者(Observer). 例子以后再写喽!

分享到:
评论

相关推荐

    设计模式之Observer - 观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...

    java设计模式之Observer参考.pdf

    Observer模式,也称为发布-订阅(Publish/Subscribe)模式,是一种行为设计模式,它允许对象在状态发生改变时通知其他对象,而无需显示地指定这些对象。在Java中,Observer模式通过`java.util.Observable`和`java....

    java设计模式之Observer[整理].pdf

    Observer(观察者)模式是设计模式中的一种,常用于实现对象之间的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在这个场景中,我们将讨论如何在Java中应用Observer模式,特别...

    JAVA设计模式chm文档

    设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    Java设计模式 设计模式介绍

    1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...

    设计模式文档 chm

    设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    Observer设计模式实例

    Observer设计模式,也被称为“发布-订阅”(Publish-Subscribe)模式或“依赖倒置”模式,是软件设计中的一种行为模式。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    C#设计模式之Observer观察者模式解决牛顿童鞋成绩问题示例

    本文实例讲述了C#设计模式之Observer观察者模式解决牛顿童鞋成绩问题。分享给大家供大家参考,具体如下: 一.理论定义 观察者模式 描述了 一种 一对多的关系。 当某一对象的状态发生改变时,其他对象会得到 改变的...

    二十三种设计模式【PDF版】

    设计模式之 Observer(观察者) 介绍如何使用 Java API 提供的现成 Observer 设计模式之 Iterator(迭代器) 这个模式已经被整合入Java的Collection.在大多数场合下无需自己制造一个Iterator,只要将对象装入...

    设计模式C++学习之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在C++中广泛应用,特别是在需要...

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

    观察者模式,也被称为发布-订阅模式或事件驱动模式,是软件设计模式中的一种行为模式。这个模式的主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    设计模式之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...

    [行为模式]head first 设计模式之观察者模式(observer)

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...

    从Java类库看设计模式

    ### 从Java类库看设计模式之Observer模式详解 #### 一、引言 在软件开发过程中,常常遇到需要在不同对象之间建立依赖关系的情况,其中一个对象的状态变化会影响到另一个对象的行为。这种需求可以用设计模式中的...

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    **C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...

    OBserver模式设计实现

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java和C++等面向对象编程语言中,这种模式广泛用于事件处理和实时系统,...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    设计模式之略见一斑(Observer观察者模式)

    本篇文章将深入探讨“Observer”观察者模式,这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心概念是主题...

Global site tag (gtag.js) - Google Analytics