观察者模式Observer的例证

观察者模式Observer的例子

一、Observer模式的意图:

     在对象的内部状态发生变化时,自动通知外部对象进行响应。

二、Observer模式的构成:

     ·被观察者:内部状态有可能被改变,而且又需要通知外部的对象

     ·观察者:需要对内部状态的改变做出响应的对象

三、Observer模式的Java实现:

    JavaAPI中已经为我们提供了Observer模式的实现。具体由java.util.Observable类和java.util.Observer接口完成。

     前者有两个重要的方法:

·setChanged:设置内部状态为已改变

·notifyObservers(Object obj):通知观察者所发生的改变,参数obj是一些改变的信息

后者有一个核心方法:

  ·update(Object obj):相应被观察者的改变,其中obj就是被观察者传递过来的信息,该方法会在notifyObservers被调用时自动调用。

 

下面是Observer模式的实现过程:

      ·创建一个被观察者,继承java.util.Observable

      ·创建一个观察者,实现java.util.Observer接口

      · 注册观察着,调用addObserver(Observer observer)

      ·在被观察者改变对象内部状态的地方,调用setChanged()方法,然后调用notifyObservers(Object)方法,通知被观察者

      ·在观察者的update(Object)方法中,对改变做出响应。

四、Observer模式的好处:

     1.Observer模式的优点:

       ·被观察者只需要知道谁在观察它,无需知道具体的观察细节

       ·被观察者一旦发生变化,只需要通过广播的方式告知观察者,至于消息如何到达则不需知道。这样的话无疑消除了被观察者和观察者之间通信的硬编码

       ·当一个被观察者同时被多个观察着观察时,观察者可以只选择自己感兴趣的事件,而忽略其它的事件

       ·多个观察者组合起来可以形成一个观察链,如果一旦需要回滚多个操作,此时观察链可以发挥作用

       ·观察者可以实时对被观察对象的变化做出响应,例如自动告警、中断运行等

     2.运用Observer模式可以

       ·屏蔽线程间的通信机制:例如两个线程之间,主线程可以作为观察者,执行线程是被观察者。彼此之间只知道对方存在,但不知道之间通信的细节

       ·消除硬编码:如果没有Observer模式,则只能采用回调的模式,或者在代码中显示地调用观察者

       ·优化异常机制:特别适合在异常发生时向顶层监控,减少try-catch代码量

 

一下是一个例子:

import java.util.*;
public class product extends Observable{ 
   private float price;////价格

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

 

 

下面是观察者:

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();
          PriceObserver priceobs=new PriceObserver();
          ////加入观察者
          product.addObserver(priceobs);
          product.setPrice(9.22f); 
   }
}

 

 

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