观察者模式定义了对象间的一对多依赖关系,让一个或多个观察者(Observer)观察一个主体对象(Observable),当主体对象的状态发生变化时,系统能通知所有的依赖此对象的观察者对象,从而使观察者对象自动更新。

  观察者模式通常包含4个角色。

  1.被观察对象的抽象基类。它通常包含多个观察者对象的引用,java提供了java.util.Observable基类来代表被观察者的抽象基类。

  2.观察者接口。该接口通常包含一个抽象方法update(),是所有观察者应该实现的一个接口,java提供了java.util.Observer接口来代表观察者接口。

  3.被观察者实现类:该类继承Observable。

  4.观察者实现类:实现Observer接口,实现update抽象方法。

  例:  观察者接口:

     public Interface Observer{

      void update(Observable o,Object arg);

    }

    被观察者类:

    public class Observable{

      private List<Observer> observers= new ArrayList<Observer>();

      public void registObserver(Observer o) {

        observers.add(o);

      }

      public void removeObserver(Observer o) {

        observers.remove(o);

      }

      public void notifyObservers(Object value) {

        for(Iterator it = observers.iterator();it.hasNext();){

          Observer o = (Observer)it.next();

          o.update(this,value);

        }

      }

    }

下面定义一个具体被观察者

import java.util.Observable;

public class Product extends Observable
{
    private String name;
    private double price;

    public Product(String name, double price)
    {
        this.name = name;
        this.price = price;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
        this.notifyObservers(name);
    }

    public double getPrice()
    {
        return price;
    }

    public void setPrice(double price)
    {
        this.price = price;
        this.notifyObservers(price);
    }

}

再定义两个具体观察者

public class NameObserver implements Observer
{
    @Override
    public void update(Observable o, Object arg)
    {
        System.out.println("物品名称"+o+"已经改变为:"+arg);
    }
}

public class PriceObserver implements Observer
{
    @Override
    public void update(Observable o, Object arg)
    {
        System.out.println("物品价格"+o+"已经改变为:"+arg);
    }
}

java事件机制就是利用观察者模式实现,被观察者当做事件源处理,观察者就是具体的事件接口