設計模式之禪-觀察者模式

觀察者模式(Observer Pattern)也叫做發佈訂閱模式(Publish/subscribe),它是在一個項目中經常使用的模式,定義如下:
Define a one-to-mang dependency between objects so that when one object changes state,all its dependents are notified and updated automatically
(定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則所有依賴於它的對象都會得到通知並被自動更新。)

觀察者通用類圖
Subject:被觀察者

定義被觀察者必須實現的職責,它必須能夠動態添加、刪除觀察者。它一般 是抽象類或者實現類,僅僅完成作爲被觀察者必須實現的職責:管理觀察者並通知觀察者(notifyObservers)

Observer觀察者

觀察者收到信息後,即進行update操作,對接收的信息進行處理
觀察者是被被觀察者管理的

ConcreteSubject具體的被觀察者

定義被觀察者自己的業務邏輯,同時定義對哪些時間進行通知。

ConcreteObserver具體的觀察者

每個觀察者在接收到消息後處理反應是不同,各個觀察者有自己的處理邏輯。

被觀察者抽象接口

public interface Observable {
	//添加一個觀察者
    public void addObserver(Observer observer);
	//刪除一個觀察者
    public void deleteObserver(Observer observer);
	//通知所有觀察者
    public void notifyObservers(String context);
}

具體實現類

public class Subject implements Observable{
	//定義一個觀察者數組
	private Vector<Observer> obsverVector = new Vector<Observer>();
	//添加一個觀察者
    public void addObserver(Observer observer){
    	obsver.add(observer);
    }
	//刪除一個觀察者
    public void deleteObserver(Observer observer){
		obsverVector.remove(obserber);
	}
	//通知所有觀察者
    public void notifyObservers(String context){
		for(Observer o : obsverVector){
			o.update(context);
		}
	}
	
	//業務邏輯,dosomething時通知所有在數組中的觀察者
	public void dosomething(){
	/**
	dosth
	*/
	notifyObservers("dosth");
	}
}

觀察者接口

public interface Observer {
	//根據被觀察者推送的信息,觀察者進行更新信息
    public void update(String context);
}

具體的client中

說下思路
先建立subject實例
然後建立不同的觀察者實例
subject裏面添加不同的觀察者實例(當然也可以刪除)
在subject更新事件的時候(可以通知觀察者)

優點

  1. 觀察者和被觀察者之間是抽象耦合(增加觀察者還是被觀察者都非常容易擴展)
  2. 建立一套觸發機制(被觀察者改變,觸發導致觀察者發生變化)

缺點

  1. 觀察者模式需要考慮開發效率和運行效率,一個被觀察者,多個觀察者。開發和調試比較複雜,而且java中消息通知是順序執行,一個觀察者卡殼或者掛了,會影響整體的執行效率。在這種情況下,一般考慮採用異步的方式。

異步處理問題
異步處理就要考慮線程安全和隊列的問題,還是看一看Message Queue,會有更深的瞭解。(作者表示:沒看過,以後再看)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章