觀察者模式是非常常用的一種設計模式聚蝶。在軟件系統(tǒng)中,當一個對象的行為依賴于另一個對象的狀態(tài)時藻治,觀察者模式就相當有用碘勉。若不適用觀察者模式提供的通用結構,而需要實現(xiàn)其類似的功能桩卵,則只能在另一個線程中不停監(jiān)控對象一來的狀態(tài)验靡。在一個復雜的系統(tǒng)中倍宾,可能會因此開啟很多線程來實現(xiàn)這一個功能,這將使系統(tǒng)的性能產(chǎn)生額外的負擔胜嗓。觀察者模式的意義也就在此高职,它可以在單線程中,使某一對象辞州,及時得知自身所依賴的狀態(tài)的變化怔锌。
觀察者模式角色如下:
1.主題接口:指被觀察的對象。當其狀態(tài)發(fā)生改變或者某件事發(fā)生時孙技,它會將這個變化通知觀察者产禾。它維護了觀察者所需要依賴的狀態(tài)。
2.具體主題:具體主題實現(xiàn)了主題接口中的方法牵啦。如新增觀察者亚情、刪除觀察者和通知觀察者。其內(nèi)部維護一個觀察者列表哈雏。
3.觀察者接口:觀察者接口定義了觀察者的基本方法楞件。當依賴狀態(tài)發(fā)生改變時,主題接口就會調用觀察者的update()方法裳瘪。
4.具體觀察者:實現(xiàn)了觀察者接口的update()方法土浸,具體處理當被觀察者狀態(tài)改變或者某一件事情發(fā)生時的業(yè)務邏輯。
下面我們就用具體的代碼來實現(xiàn)一個觀察者模式:
主題接口的實現(xiàn)如下:
public interface ISubject{
void attach(IObserver observer);
void detach(IObserver observer);
void inform();
}
觀察者接口實現(xiàn)如下:
public interface IObserver{
void update(Event evt);
}
一個具體的主題實現(xiàn)彭羹,注意黄伊,它維護了觀察者隊列,提供了增加和刪除觀察者的方法并通過inform()通知觀察者派殷。
public class ConcreteSubject implements ISubject{
Vector<IObserver> observers = new Vector<IObserver>();
public void attach(IObserver observer){
observers.addElement(observer);
}
public void detach(IObserver observer){
observers.removeElement(observer);
}
public void inform(){
Event event = new Event();
for(IObserver ob:observers){
ob.update(event);
}
}
}
一個具體的觀察者實現(xiàn)如下还最,當其監(jiān)聽的狀態(tài)發(fā)生改變時,update()方法就會被主題回調毡惜,進而可以在觀察者內(nèi)部進行業(yè)務邏輯的處理拓轻。
public class ConcreteObserver implements IObserver{
public void update(Event evt){
System.out.println("observer receives information");
}
}
觀察者模式如此常用,以致于JDK內(nèi)部就已經(jīng)為我們準備了一套觀察者模式實現(xiàn)经伙。它位于java.util包中扶叉,包括java.util.Observable類和java.util.Observer接口。
在java.util.observable類中帕膜,已經(jīng)實現(xiàn)了主要功能枣氧,如增加觀察者、刪除觀察者和通知觀察者垮刹,我們可以直接通過繼承Observable使用這些功能作瞄。java.util.Observer接口是觀察者接口,它的update()方法會在java.util.Observabel的notifyObservers()方法中被回調危纫,以獲得最新的狀態(tài)變化宗挥。通常在觀察者模式中Observer接口總是應用程序的核心擴展對象乌庶。具體的業(yè)務邏輯總是會被封裝在update()方法中。