代碼
abstract class Subject {
private Vector<Observer> obs = new Vector<Observer>();
public void addObserver(Observer obs){
this.obs.add(obs);
}
public void delObserver(Observer obs){
this.obs.remove(obs);
}
protected void notifyObserver(){
for(Observer o: obs){
o.update();
}
}
public abstract void doSomething();
}
class ConcreteSubject extends Subject {
public void doSomething(){
System.out.println("被觀察者事件反生");
this.notifyObserver();
}
}
interface Observer {
public void update();
}
class ConcreteObserver1 implements Observer {
public void update() {
System.out.println("觀察者1收到信息,並進行處理。");
}
}
class ConcreteObserver2 implements Observer {
public void update() {
System.out.println("觀察者2收到信息,並進行處理。");
}
}
public class Client {
public static void main(String[] args){
Subject sub = new ConcreteSubject();
sub.addObserver(new ConcreteObserver1()); //添加觀察者1
sub.addObserver(new ConcreteObserver2()); //添加觀察者2
sub.doSomething();
}
}
類圖‘
優點
- 輕度的關聯關係,並且是抽象耦合,容易進行擴展。
- *觀察者模式是一種常用的觸發機制,它形成一條觸發鏈,依次對各個觀察者的方法進行處理。但同時,這也算是觀察者模式一個缺點,由於是鏈式觸發,當觀察者比較多的時候,性能問題是比較令人擔憂的。並且,在鏈式結構中,比較容易出現循環引用的錯誤,造成系統假死。
總結
java語言中,有一個接口Observer,以及它的實現類Observable,對觀察者角色常進行了實現。我們可以在jdk的api文檔具體查看這兩個類的使用方法。
做過VC++、javascript DOM或者AWT開發的朋友都對它們的事件處理感到神奇,瞭解了觀察者模式,就對事件處理機制的原理有了一定的瞭解了。如果要設計一個事件觸發處理機制的功能,使用觀察者模式是一個不錯的選擇,AWT中的事件處理DEM(委派事件模型Delegation Event Model)就是使用觀察者模式實現的。
學習資料:卡奴達摩的專欄