前言:
本文僅作為第一次學(xué)習(xí)設(shè)計模式的參考和筆記时迫。
初探觀察者模式:
觀察者模式:Observer Pattern
又名:發(fā)布訂閱模式捣辆。
原話:Define a one-to-many dependency between objects so that when one object changes state ,all its dependents are notified and updated automatically.
直譯:定義對象間一種一對多的依賴關(guān)系,使得每當(dāng)一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并被自動更新。(因為你變了而线,所以我們也變了)
1. 定義:被觀察者(一個對象)改變某種狀態(tài),所有觀察者(多個對象)會做出相應(yīng)的反應(yīng)恋日。
2. 示例類圖:
- Subject:被觀察者
- Observer觀察者
- ConcreteSubject具體的被觀察者
- ConcreteObserver具體的觀察者
3. 示例代碼:
//被觀察者:Subject
abstract class Subject{
//定義一個觀察者數(shù)組
private Vector<Observer> ObsVector = new Vector<Observer>();
//增加一個觀察者
public void addObserver(Observer o){
this.ObsVector.add(o);
}
//刪除一個觀察者
public void delObserver(Observer o){
this.ObsVector.remove(o);
}
//通知所有觀察者
public void notifyObservers(){
for(Observer o:this.ObsVector){
o.update();
}
}
}
//具體的被觀察者:ConcreteSubject
class ConcreteSubject extends Subject{
//具體的業(yè)務(wù)
public void doSomeThing(){
/*
* do something here!
*/
//最后 通知所有觀察者
super.notifyObservers();
}
}
//觀察者接口:Observer
instance Observer{
//更新方法
public void update();
}
//具體的觀察者:ConcreteObserver
class ConcreteObserver implements Observer{
//實現(xiàn)更新方法
public void update(){
//becasuse of Subject ,ConcreteObserver do something here, and response膀篮!
}
}
public class Client{
public static void main(String[] args){
//1.創(chuàng)建一個被觀察者
ConcreteSubject subject = new ConcreteSubject();
//2.定義一個觀察者
Observer obs = new ConcreteSubject();
//3.觀察者觀察被觀察者
subject.addObserver(obs);
//4.被觀察者行動,所有觀察者連鎖行動
subject.doSomeThing();
}
}
4. 優(yōu)點:
- 觀察者和被觀察者之間 低耦合
- 可建立一套完美的連續(xù)觸發(fā)機(jī)制
5. 缺點:
- 復(fù)雜的調(diào)用岂膳,降低開發(fā)效率誓竿,以及運(yùn)行效率
- 一個觀察者卡住,整體會卡滋附亍(多采用多線程異步處理)
6. 使用場景:
- 關(guān)聯(lián)行為場景
- 事件多級觸發(fā)場景
- 跨系統(tǒng)的消息交換場景
7. 注意事項:
- 廣播鏈問題:
一個對象可以有雙重身份筷屡,既是觀察者,又是被觀察者簸喂。邏輯復(fù)雜毙死,可維護(hù)性降低。一個項目最好最多只出現(xiàn)一個對象既是觀察者又是被觀察者喻鳄,這比較好控制扼倘。 - 異步處理問題:
如果觀察者比較多,處理時間較長除呵,使用多線程異步處理唉锌,多線程異步就要考慮到 “線程的安全” 和 “隊列”的問題。