觀察者模式

觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化,會通知所有觀察者對象,使他們能自動更新自己

 

import java.util.Observable;

public class House extends Observable {
    private int price = 1000000;

    public void modifyRoomRate(int price) {
        this.price += price;
        super.setChanged();
        notifyObservers(this.price);
    }
}

 

 

import java.util.Observable;
import java.util.Observer;

public class Buyer1 implements Observer {

    public void update(Observable paramObservable, Object paramObject) {
        System.out.println(paramObservable.countObservers()+"你好現在房價調整爲  :" + paramObject);
    }
}

 

 

import java.util.Observable;
import java.util.Observer;

public class Buyer2 implements Observer {

    public void update(Observable paramObservable, Object paramObject) {
        System.out.println(paramObservable.countObservers()+"你好現在房價調整爲  :" + paramObject);
    }
}

 

public class Client {

    public static void main(String[] args) {
        //被觀察者
        House house = new House();
        //觀察者
        Buyer1 buyer1 = new Buyer1();
        //觀察者
        Buyer2 buyer2 = new Buyer2();
        
        house.addObserver(buyer1);
        house.addObserver(buyer2);
        
        house.modifyRoomRate(2000);
    }
}

 

Observable源代碼:

 

package java.util;

public class Observable
{
  private boolean changed = false;
  private Vector obs = new Vector();

  public synchronized void addObserver(Observer paramObserver)
  {
    if (paramObserver == null)
      throw new NullPointerException();
    if (this.obs.contains(paramObserver))
      return;
    this.obs.addElement(paramObserver);
  }

  public synchronized void deleteObserver(Observer paramObserver)
  {
    this.obs.removeElement(paramObserver);
  }

  public void notifyObservers()
  {
    notifyObservers(null);
  }

  public void notifyObservers(Object paramObject)
  {
    Object[] arrayOfObject;
    synchronized (this)
    {
      if (!(this.changed))
        return;
      arrayOfObject = this.obs.toArray();
      clearChanged();
    }
    for (int i = arrayOfObject.length - 1; i >= 0; --i)
      ((Observer)arrayOfObject[i]).update(this, paramObject);
  }

  public synchronized void deleteObservers()
  {
    this.obs.removeAllElements();
  }

  protected synchronized void setChanged()
  {
    this.changed = true;
  }

  protected synchronized void clearChanged()
  {
    this.changed = false;
  }

  public synchronized boolean hasChanged()
  {
    return this.changed;
  }

  public synchronized int countObservers()
  {
    return this.obs.size();
  }
}

 

 Observer 源代碼:

package java.util;

public abstract interface Observer
{
  public abstract void update(Observable paramObservable, Object paramObject);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章