1.觀察者定義:有A,B,C,D四個獨立的對象,B,C,D對象希望第一時間知道A對象內部的數據發生變化,以便做出相應的措施。
注:有多個觀察者,多個被觀察者。
觀察者與被觀察者也不是對立的,一個對象可以觀察其他對象,也可以被其他對象觀察。
2.使用場景:有一家報社提供了一個app,可以供用戶訂閱報紙。用戶可以通過訂閱申請進行訂閱,此後每當報社那邊報紙信息有更新時就會收到新報紙的推送信息然後根據報紙的信息做相應的工作。當用戶覺得該報紙不適合自己時可以進行退訂,此後將不再收到報社的推送信息。
3.觀察者模式在java中的使用:
java提供了兩個類來表示觀察者(Observer---interface)和被觀察者(Observable---class)。
被觀察者:首先我們需要繼承Observable並設置所需要更新的值:
import java.util.Observable;
public class DataObservable extends Observable{
private String data ;
public void setData(String
data){
this .data =
data ;
setChanged();
notifyObservers();
}
public String getData() {
return data ;
}
}
觀察者們:需要實現Observer並重寫update方法,同時需要在構造器中傳入被觀察者對象以便當觀察者實例化時註冊到被觀察者上。
import java.util.Observable;
import java.util.Observer;
public class CatObserver implements Observer{
public CatObserver(Observable o){
o.addObserver( this);
}
@Override
public void update(Observable
o, Object arg) {
DataObservable dataObservable = (DataObservable)o;
String data = dataObservable.getData();
System. out.println("cat" +"===========" +data);
}
}
import java.util.Observable;
import java.util.Observer;
public class DogObserver implements Observer{
public DogObserver (Observable
o){
o.addObserver( this );
}
@Override
public void update(Observable
o, Object arg) {
DataObservable dataObservable = (DataObservable)o;
String data = dataObservable.getData();
System. out .println("dog" +"===========" +data);
}
}
然後我們來書寫測試類:
public static void main(String[]
args) throws InterruptedException {
DataObservable data = new DataObservable();
CatObserver cat = new CatObserver(data);
DogObserver dog = new DogObserver(data);
for(int i
= 0 ; i < 10 ; i ++){
Thread. sleep(1000);
data.setData( new Date().toString());
}
}
控制檯輸出結果: