Java中的觀察者模式

1.相關類介紹

public class Observable extends Object
此類表示模型視圖範例中的 observable 對象,或者說「數據」。可將其子類化,表示應用程序想要觀察的對象。 
一個 observable 對象能夠有一個或多個觀察者。觀察者能夠是實現了 Observer 接口的任意對象。一個 observable 實例改變後,調用 Observable 的 notifyObservers 方法的應用程序會經過調用觀察者的 update 方法來通知觀察者該實例發生了改變。 
未指定發送通知的順序。Observable 類中所提供的默認實現將按照其註冊的重要性順序來通知 Observers,可是子類可能改變此順序,從而使用非固定順序在單獨的線程上發送通知,或者也可能保證其子類聽從其所選擇的順序。 

注意,此通知機制與線程無關,而且與 Object 類的 wait 和 notify 機制徹底獨立。 
新建立一個 observable 對象時,其觀察者集是空的。當且僅當 equals 方法爲兩個觀察者返回 true 時,才認爲它們是相同的。 
--------------------------------------------------------------------------------
構造方法摘要 
Observable() 
          構造一個帶有零個觀察者的 Observable。 
  方法摘要 
 void addObserver(Observer o) 
          若是觀察者與集合中已有的觀察者不一樣,則向對象的觀察者集中添加此觀察者。 
protected  void clearChanged() 
          指示對象再也不改變,或者它已對其全部的觀察者通知了最近的改變,因此 hasChanged 方法將返回 false。 
 int countObservers() 
          返回 Observable 對象的觀察者數目。 
 void deleteObserver(Observer o) 
          從對象的觀察者集合中刪除某個觀察者。 
 void deleteObservers() 
          清除觀察者列表,使此對象再也不有任何觀察者。 
 boolean hasChanged() 
          測試對象是否改變。 
 void notifyObservers() 
          若是 hasChanged 方法指示對象已改變,則通知其全部觀察者,並調用 clearChanged 方法來指示此對象再也不改變。 
 void notifyObservers(Object arg) 
          若是 hasChanged 方法指示對象已改變,則通知其全部觀察者,並調用 clearChanged 方法來指示此對象再也不改變。 
protected  void setChanged() 

          標記此 Observable 對象爲已改變的對象;如今 hasChanged 方法將返回 true。 java


public interface Observer
一個可在觀察者要獲得 observable 對象更改通知時可實現 Observer 接口的類。 
--------------------------------------------------------------------------------
方法摘要 
 void update(Observable o, Object arg) 
          只要改變了 observable 對象就調用此方法。 

2.實例

//觀察者1
public class SmtpObserver implements Observer
{
	@Override
	public void update(Observable o, Object arg)
	{
		System.out.println(arg.toString());
	}
} 

//觀察者2
public class Pop3Observer implements Observer
{
	@Override
	public void update(Observable o, Object arg)
	{
		System.out.println(arg.toString());
	}
}

//主體 被觀察者
public class Subject extends Observable{   
       
    /**  
     * 業務方法,一旦執行某個操做,則通知觀察者  
     */  
    public void doBusiness(){   
        if (true) {   
            super.setChanged();   
        }   
        notifyObservers("hello");   
    }   
  
    public static void main(String [] args) {   
        //建立一個被觀察者   
        Subject subject = new Subject();   
           
        //建立兩個觀察者   
        Observer smtpObserver = new SmtpObserver();   
        Observer pop3Observer = new Pop3Observer();   
           
        //把兩個觀察者加到被觀察者列表中   
        subject.addObserver(smtpObserver);   
        subject.addObserver(pop3Observer);   
           
        //執行業務操做   
        subject.doBusiness();   
    }   
}
相關文章
相關標籤/搜索