像activeMQ等消息隊列中,我們經常會使用發佈訂閱模式,但是你有沒有想過,客戶端時如何及時得到訂閱的主題的信息?其實就裡就用到了觀察者模式。在軟體系統中,當一個對象的行為依賴於另一個對象的狀態時,觀察者模式就相當有用。如果不使用觀察者模式提供的通用結構,而需要我們實現類似的功能,想想我們該如何實 ...
像activeMQ等消息隊列中,我們經常會使用發佈訂閱模式,但是你有沒有想過,客戶端時如何及時得到訂閱的主題的信息?其實就裡就用到了觀察者模式。在軟體系統中,當一個對象的行為依賴於另一個對象的狀態時,觀察者模式就相當有用。如果不使用觀察者模式提供的通用結構,而需要我們實現類似的功能,想想我們該如何實現,我們只能在另外一個線程不斷監聽對象所依賴的狀態。當然下麵的例子都是基於一個進程內觀察者模式的舉例,你可能會和我當初一樣不解,消息隊列中的消費者是通過socket進行通信得到訂閱的主題的信息。其實還是一回事的,被觀察者(主題)裡面會維護一個與它有訂閱的所有消費者的連接,當被觀察者(主題)裡面添加一個消息時,就會調用自身的方法,把該消息通過維持的socket發送給所有訂閱的消費者。 下次再跳槽,我就不是僅僅調侃我掌握kafka等消息隊列的特性了,我又可以結合設計模式來侃我對消息隊列的理解,這個逼吹的響亮吧。 觀察者模式可以用於事件監聽,通知發佈等場合。可以確保觀察者在不使用輪詢監控的情況下,及時收到相關的消息和事件。
原文和作者一起討論:http://www.cnblogs.com/intsmaze/p/6017508.html
新浪微博:intsmaze劉洋洋哥



在java.util.Observable類中,已經實現了主要的功能,如增加觀察者,刪除觀察者和通知觀察者,我們可以直接通過繼承Observable使用這些功能。 java.util.Observer介面是觀察者介面,它的update方法會在java.util.Observable中的notifyObservers方法中被回調,以獲得最新的狀態變化。通常在觀察者模式中,Observer介面就是我們程式的核型擴展對象,具體業務邏輯會被封裝在update方法中。

public class Observable { private boolean changed = false; private Vector obs; //創建被觀察者時就創建一個它持有的觀察者列表,註意,這個列表是需要同步的。 public Observable() { obs = new Vector(); } /** * 添加觀察者到觀察者列表中去 */ public synchronized void addObserver(Observer o) { if (o == null) throw new NullPointerException(); if (!obs.contains(o)) { obs.addElement(o); } } /** * 刪除一個觀察者 */ public synchronized void deleteObserver(Observer o) { obs.removeElement(o); } /** * 這個方法接受一個參數,這個參數一直傳到觀察者里,以供觀察者使用 */ public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); } } public interface Observer { void update(Observable o, Object arg); } public class JMSObserver implements Observer{ public void update(Observable o, Object arg) { System.out.println("發送消息給jms伺服器的觀察者已經被執行"); } } public class Subject extends Observable{ /** * 業務方法,一旦執行某個操作,則通知觀察者,在隊列模式中,其實就是當消息被添加到隊列的時候,添加進隊方法裡面調用了通知方法。 */ public void doBusiness(){ if (true) { super.setChanged(); } notifyObservers("現在還沒有的參數"); } public static void main(String [] args) { //創建一個被觀察者 Subject subject = new Subject(); //創建觀察者 Observer jmsObserver = new JMSObserver(); //把兩個觀察者加到被觀察者列表中 subject.addObserver(jmsObserver); //執行業務操作 subject.doBusiness(); } }MVC模式(有空,研究代碼好好理解,有時加分調侃項目) MVC模式是一種架構模式,它包含三個角色:模型(Model),視圖(View)和控制器(Controller)。觀察者模式可以用來實現MVC模式,觀察者模式中的觀察目標就是MVC模式中的模型(Model),而觀察者就是MVC中的視圖(View),控制器(Controller)充當兩者之間的中介者(Mediator)。當模型層的數據發生改變時,視圖層將自動改變其顯示內容。
