觀察者(Observer)模式標準定義:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時, 全部依賴於它的對象都獲得通知並被自動更新。html
觀察者(Observer)模式屬於對象行爲型模式。觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知全部觀察者對象,使他們可以自動更新本身。這一模式中主要針對兩個對象object和Observer。一個object能夠有多個Observer,當—個object對象的狀態發生改變時,全部依賴於它的Observer對象都獲得通知被自動更新。java
在JDK中定義了觀察者模式:ide
subject -> java.util.Observable(類)測試
observer -> java.util.Observer(接口).net
使用jdk自帶的觀察者模式的缺點:server
1.Observable是一個類,而不是一個接口,致使Observable類的擴展性不高,不如本身實現的觀察者模式靈活。htm
2.Observable將某些方法保護了起來(setChanged()和clearChanged()爲protected),這意味着除非繼承自Observable,不然將有關鍵的方法不能調用。致使沒法經過組合的方式使其它類得到Observable類的功能。對象
同時.Spring的事件驅動模型使用的是觀察者模式。blog
示例:https://www.cnblogs.com/fingerboy/p/6393644.html繼承
如下爲本身代碼實現的觀察者模式,舉例爲主人(被觀察者)和動物(觀察者)的故事。
/**
*
* @describe:被觀察者(主題)接口
*
*/
public interface Subject {
//添加觀察者
public void addObserver(Observer obj);
//移除觀察者
public void deleteObserver(Observer obj);
//當主題方法改變時,這個方法被調用,通知全部的觀察者
public void notifyObserver();
}
/**
*
* @describe:定義一個主人的被觀察這對象:男主人
*
*/
public class MasterSubject implements Subject,Runnable{
String name="男主人";
List<Observer> observers=new ArrayList<Observer>();
public void addObserver(Observer obj) {
if(!observers.contains(obj)){
observers.add(obj);
}
}
public void deleteObserver(Observer obj) {
if(observers.contains(obj)){
observers.remove(obj);
}
}
public void notifyObserver() {
for(Observer observer : observers){
observer.update(name);
}
}
@Override
public void run() {
try {
Thread.sleep(3000);
notifyObserver();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
*
* @describe:觀察者接口
*
*/
public interface Observer {
public abstract void update(String name);
}
/**
*
* @describe:定義小狗觀察者
*
*/
public class DogObserver implements Observer{
String message="汪汪汪";
@Override
public void update(String name) {
System.out.println(name+"回來了"+message);
}
}
/**
*
* @describe:定義小貓觀察者
*
*/
public class CatObserver implements Observer{
String message="喵喵喵";
@Override
public void update(String name) {
System.out.println(name+"回來了"+message);
}
}
/**
*
* @describe:測試類
*
*/
public class Test {
public static void main(String[] args) {
MasterSubject subject=new MasterSubject();
Observer dog=new DogObserver();
Observer cat=new CatObserver();
subject.addObserver(dog);
subject.addObserver(cat);
new Thread(subject).start();
}
}
運行結果:
男主人回來了汪汪汪
男主人回來了喵喵喵