1. 程式人生 > >設計模式(十二):觀察者模式

設計模式(十二):觀察者模式

優點:

  觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表,每一個具體觀察者都符合一個抽象觀察者的介面。被觀察者並不認識任何一個具體觀察者,它只知道它們都有一個共同的介面。

缺點:

  ① 如果在被觀察者之間有迴圈依賴的話,被觀察者會觸發它們之間進行迴圈呼叫,導致系統崩潰。在使用觀察者模式是要特別注意這一點。

  ② 雖然觀察者模式可以隨時使觀察者知道所觀察的物件發生了變化,但是觀察者模式沒有相應的機制使觀察者知道所觀察的物件是怎麼發生變化的。

適用範圍:

  當一個物件的改變需要同時改變其他物件的時候,而且它不知道具體有多少物件有待改變時,應該考慮使用觀察者模式。

客戶端:  

  //被觀察者

  Subject s = new Secretary(); 

  //兩個觀察者
  Observer o1 = new StockObserver("張",s);
  Observer o2 = new NBAObserver("李",s);

  //拜託通知
  s.addObserver(o1);
  s.addObserver(o2);

  //未通知
  s.removeObserver(o1);

  //觀察結果
  s.setAction("老闆回來了");

  //發出通知
  s.tell(); 

 

 一句話概括:

  定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所依賴於它的物件都將得到通知並自動更新。

    /**
     * Subject (被觀察者介面,包括觀察者(委託人)列表,增加和減少觀察者(委託人)的方法,通知觀察結果的方法)
     * Secretary (被觀察者例項,前臺祕書) - 觀察者由直接觀察實際情況,轉為觀察被觀察者的狀態,即等待被觀察者傳送提醒訊息
     *
     * Observer (觀察者介面,委託的方法,改變當前行為的方法)
     * StockObserver (看股票的觀察者)   NBAObserver (看NBA的觀察者)
     */