設計模式(十六) 觀察者模式
阿新 • • 發佈:2018-11-09
觀察者模式也叫釋出/訂閱模式, 定義一種1對多的依賴關係,使得每當一個物件改變狀態,則所有依賴於它的物件都會得到通知並被自動更新
觀察者模式的幾個角色:
- Subject 被觀察者。定義被觀察者必須實現的職責,它必須能夠動態的增加,取消觀察者。 要有管理觀察者並通知觀察者。
- Observer觀察者。觀察者接收到訊息後,進行update操作,對接收到的資訊進行處理。
- ConcreteSubject 具體的被觀察者。 定義被觀察者自己的業務邏輯,同時定義對哪些事件進行通知。
- ConcreteObserver 具體的觀察者。 每個觀察者接收到訊息後的處理反應是不同的,各個觀察者有自己的處理邏輯。
public abstract class Subject{ private Vector<Observer> obsVector=new Vector<>(); public void addObserver(Observer o){ this.obsVector.add(o); } public void delObserver(Observer o){ this.obsVector.remove(o); } public void notifyObservers(Observer o){ for(Observer o: this.obsVector){ o.update(); } } }
public class ConcreteSubject extends Subject{
public void doSomething(){
// do something
super.notifyObservers();
}
}
public interface Observer{
public void update();
}
public class ConcreteObserver implements Observer{ public void udpate(){ System.out.println("receive message , and handle"); } }
public class Client{
public static void main(String[] args){
ConcreteSubject subject=new ConcreteSubject();
Observer obs=new ConcreteObserver();
subject.addObserver(obs);
subject.doSomething();
}
}
觀察者模式的優點
- 觀察者和被觀察者之間是抽象耦合的
- 建立一套觸發機制。 根據單一職責,每個類的職責都是單一的,觀察者模式為不同類之間的職責串了起來。
觀察者模式缺點
開發效率與執行問題,多個觀察者時,觀察者卡殼會影響整體執行效率。
觀者者模式的使用場景
- 關聯行為場景
- 事件多級觸發
- 跨系統的訊息交換場景,如訊息佇列的處理機制。
觀察者模式的注意事項
- 廣播鏈的問題。 觀察者和被觀察者不要形成環
- 非同步處理問題。