`
yaojialing
  • 浏览: 255429 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

观察者模式(发布-订阅模式)

阅读更多

观察者模式简介:

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

 

使用例子:

网上商店中的商品在名称、价格发生变化时,必须自动通知会员,Java的API为我们提供了Observer接口和Observable类来实现观察者模式。
  Observable(可观察者)类允许在自身发生改变时,通知其它对象(实现接口Observer,观察者)。

 

使用java.util.Observer接口和java.util.Observable类实现观察者模式:

观察者实现Observer接口,并重写其中的update方法,供被观察者状态改变时调用。

被观察者继承Observable类,在Observable类中有增加,删除观察者类的方法,还有通知所有观察者都update的方法。状态改变时,先setChanged,再notifyObservers。

 

Observer观察者接口源码:

 

package java.util;    
public interface Observer    
{    
/**   
* 当被观察的对象发生变化时,这个方法会被调用。   
*/    
void update(Observable o, Object arg);    
}   

 

 

被观察者Observable类源码:

package java.util;    
public class Observable    
{    
private boolean changed = false;    
private Vector obs;    
/** 用0个观察者构造一个被观察者。**/    
public Observable()    
{    
obs = new Vector();    
}    
/**   
* 将一个观察者加到观察者列表上面。   
*/    
public synchronized void addObserver(Observer o)    
{    
if (!obs.contains(o))    
{    
obs.addElement(o);    
}    
}    
/**   
* 将一个观察者对象从观察者列表上删除。   
*/    
public synchronized void deleteObserver(Observer o)    
{    
obs.removeElement(o);    
}    
/**   
* 相当于 notifyObservers(null)   
*/    
public void notifyObservers()    
{    
notifyObservers(null);    
}    
/**   
* 如果本对象有变化(那时hasChanged 方法会返回true)   
* 调用本方法通知所有登记在案的观察者,即调用它们的update()方法,   
* 传入this和arg作为参量。   
*/    
public void notifyObservers(Object arg)    
{    
/**   
* 临时存放当前的观察者的状态。参见备忘录模式。   
*/    
Object[] arrLocal;    
synchronized (this)    
{    
if (!changed) return;    
arrLocal = obs.toArray();    
clearChanged();    
}    
for (int i = arrLocal.length-1; i>=0; i--)    
((Observer)arrLocal[i]).update(this, arg);    
}    
/**   
* 将观察者列表清空   
*/    
public synchronized void deleteObservers()    
{    
obs.removeAllElements();    
}    
/**   
* 将“已变化”设为true   
*/    
protected synchronized void setChanged()    
{    
changed = true;    
}    
/**   
* 将“已变化”重置为false   
*/    
protected synchronized void clearChanged()    
{    
changed = false;    
}    
/**   
* 探测本对象是否已变化   
*/    
public synchronized boolean hasChanged()    
{    
return changed;    
}    
/**   
* 返还被观察对象(即此对象)的观察者总数。   
*/    
public synchronized int countObservers()    
{    
return obs.size();    
}    
} 

 

 

下面是一个被观察者(产品类):

 

import java.util.*;
public class product extends Observable{ 
   private String name;////产品名
   private float price;////价格

   public String getName(){ return name;}
   public void setName(String name){
    this.name=name;
   ////设置变化点 
    setChanged();
    notifyObservers(name);////通知观察者

   }   

   public float getPrice(){ return price;}
   public void setPrice(float price){
    this.price=price;
   ////设置变化点
    setChanged();
    notifyObservers(new Float(price)); 

   }

   ////以下可以是数据库更新 插入命令.
   public void saveToDb(){
   System.out.println("saveToDb");
    }

}

 

 

下面是两个观察者:

import java.util.*;
public class NameObserver implements Observer{

   private String name=null;
   public void update(Observable obj,Object arg){
     if (arg instanceof String){
      name=(String)arg;
      ////产品名称改变值在name中
      System.out.println("NameObserver :name changet to "+name);

     }

      }
   }

import java.util.*;
public class PriceObserver implements Observer{
   private float price=0;
   public void update(Observable obj,Object arg){
     if (arg instanceof Float){

      price=((Float)arg).floatValue();
  
      System.out.println("PriceObserver :price changet to "+price);

     }


   }

}

 

 

下面是测试类:

public class Test {

   public static void main(String args[]){
    Product product=new Product();
    Observer nameobs=new NameObserver();
    Observer priceobs=new PriceObserver();

    ////加入观察者
    product.addObserver(nameobs);
    product.addObserver(priceobs);

    product.setName("applet");
    product.setPrice(9.22f); 

   }
}

 

 

 

运行结果:
C:\java>java  Test
NameObserver :name changet to applet
PriceObserver :price changet to 9.22

分享到:
评论

相关推荐

    发布-订阅者模式的一个小例子程序

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

    JAVA 发布-订阅(观察者)模式

    在Java中,观察者模式主要通过Java的`java.util.Observable`和`java.util.Observer`接口来实现。 首先,我们要理解“发布-订阅”模式的基本概念。在这一模式中,我们称事件的发布者为Subject(主题),而对事件感...

    观察者模式(发布-订阅)(转载含实例)

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计模式中的行为模式之一,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。...

    设计模式实现——观察者模式

    7. **与发布-订阅模式的关系**:观察者模式是发布-订阅模式的一种实现方式。在发布-订阅模式中,发布者发布事件,订阅者订阅感兴趣的事件,当事件发生时,订阅者会收到通知。两者的主要区别在于观察者模式更强调对象...

    设计模式-观察者模式-作业-observer.zip

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

    《深入浅出Node.js》:Node异步编程解决方案之事件发布-订阅模式.docx

    事件发布-订阅模式,又称为观察者模式,是异步编程中常用的一种设计模式。它将回调函数事件化,使得代码更易于理解和维护。在Node.js中,`events`模块提供了这一模式的实现,大多数核心模块如http、fs和stream都继承...

    设计模式--观察者模式java例子

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

    android学习日记-6 观察者模式与订阅者模式

    在Android开发中,观察者模式(Observer Pattern)和订阅者模式(Subscriber Pattern)是两种重要的设计模式,它们在实现事件驱动编程中起着关键作用。本文将深入探讨这两种模式的概念、工作原理以及在Android开发中...

    设计模式专题之(十八)观察者模式---设计模式观察者模式示例代码(python--c++)

    观察者模式是软件设计模式中的一种行为模式,它允许一个对象,称为"主题",维护一个依赖于它的对象列表,这些对象被称为"观察者"。当主题的状态发生改变时,它会通知所有观察者,使它们能够自动更新自己。这种模式在...

    18 发布-订阅模式:去 adadis 买鞋.pdf

    发布-订阅模式,又称观察者模式,是一种广泛应用于软件开发中的设计模式,尤其在JavaScript中。这个模式的主要目的是实现对象间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知...

    java观察者模式观察者模式

    观察者模式是设计模式中的一种行为模式,它在Java编程中有着广泛的应用。该模式的主要目的是定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式也被...

    设计模式-观察者

    观察者模式的核心思想是发布-订阅模型,其中被观察的对象被称为主题(Subject),而关心主题状态变化的其他对象称为观察者(Observer)。在Java中,`java.util.Observable` 和 `java.util.Observer` 类为实现观察者...

    设计模式-观察者模式(讲解及其实现代码)

    观察者模式,也被称为发布-订阅模式,是软件设计中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在分布式系统、事件驱动...

    Android设计模式--观察者模式DEMO

    Android设计模式--观察者模式DEMO 观察者模式是一个使用频率非常高的模式,他最常用的地方是GUI系统和订阅-发布系统。 该模式的最重要的作用就是解耦,使观察者和被观察者之间依赖尽可能小,甚至好无依赖。

    JavaScript设计模式之观察者模式(发布者-订阅者模式)

    在JavaScript中,观察者模式也被称作发布-订阅模式(Publish-Subscribe Pattern),是一种行为设计模式,它允许对象之间通过事件来通信。 观察者模式的核心概念包括观察者(Observer)和目标(Subject)。观察者是...

    游戏设计2-观察者模式的应用-攻击

    5. **性能优化**:为了提高性能,观察者模式还可以结合“发布-订阅”模型,其中主体发布一个消息到消息队列,而观察者则根据需要选择性地订阅并处理这些消息,避免了不必要的计算。 在提供的GameDemo文件中,我们...

    设计模式系列博客--观察者模式

    观察者模式的核心思想是将数据与处理数据的逻辑分离,数据变化时通过接口通知订阅者,让订阅者能够及时响应并执行相应的操作。 策略模式(Strategy Pattern)则是另一种行为模式,它定义了一系列算法,并将每一个...

    java 设计模式 观察者模式 简单实例 包括测试test类

    观察者模式广泛应用于各种领域,例如GUI事件处理、订阅-发布系统、实时数据更新等。在GUI编程中,按钮点击、文本框输入等事件都可以通过观察者模式来处理。在订阅-发布系统中,用户订阅某个话题,当有新消息时,...

    利用观察者模式(发布/订阅模式)制作一个“代替”广播的通知类

    观察者模式,也被称为发布/订阅模式,是软件设计模式中的一个重要概念,它在很多场景下用于实现对象之间的通信和事件处理。在这个模式中,一个主题(Subject)维护了一个观察者(Observer)列表,当主题的状态发生...

Global site tag (gtag.js) - Google Analytics