定義
當一個對象的狀態(tài)發(fā)生改變時郑藏,所有依賴于他的訂閱者都會受到通知衡查,這種就叫做觀察者模式
本質
觸發(fā)聯(lián)動
優(yōu)點
如果在不使用觀察者模式情況下,如果想實時獲取對象的狀態(tài)并及時做出相應操作必盖,一般會想到去輪循獲取這個對象拌牲,這種開銷極大(主動查詢,觀察者模式是被動獲取)
通過以下案例就能很明確的了解什么是觀察者模式了:
首先定義一個目標對象(被觀察者)
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
/**
* 注冊觀察者
*
* @param observer
*/
public void attach(Observer observer) {
this.observers.add(observer);
}
/**
* 取消注冊
*
* @param observer
*/
public void detach(Observer observer) {
this.observers.remove(observer);
}
/**
* 通知所有注冊的觀察者
*/
protected void notifyObservers() {
for (Observer item : observers) {
item.update(this);
}
}
}
然后定義一個觀察者
public interface Observer {
/**
* 更新歌粥,當目標對象的狀態(tài)發(fā)生改變時塌忽,這個方法會被調用
*
* @param subject
* 目標對象,方便獲取相應的目標對象的狀態(tài)
*
*/
void update(Subject subject);
}
然后定義一個具體的目標對象(具體的被觀察者)
public class ConcreateSubject extends Subject {
/**
* 目標對象的狀態(tài)
*/
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
// 目標對象的狀態(tài)發(fā)生改變失驶,通知各個觀察者
notifyObservers();
}
}
再定義一個具體的觀察者
public class ConcreateObserver implements Observer {
@Override
public void update(Subject subject) {
System.out.println("目標對象的狀態(tài)發(fā)生改變:" + ((ConcreateSubject) subject).getSubjectState());
}
}
最后寫一個測試類
public class Client {
public static void main(String[] args) {
// 目標
ConcreateSubject subject = new ConcreateSubject();
// 訂閱者
Observer observer1 = new ConcreateObserver();
Observer observer2 = new ConcreateObserver();
// 注冊
subject.attach(observer1);
subject.attach(observer2);
// 目標對象發(fā)生改變
subject.setSubjectState("啟動土居。。嬉探。");
// 取消注冊
subject.detach(observer1);
// 再次改變
subject.setSubjectState("再次啟動擦耀。。涩堤。");
}
}
打印日志為
目標對象的狀態(tài)發(fā)生改變:啟動眷蜓。。胎围。
目標對象的狀態(tài)發(fā)生改變:啟動吁系。。白魂。
目標對象的狀態(tài)發(fā)生改變:再次啟動汽纤。。碧聪。