觀察者模式

包括這個模式在內的接下來的四個模式,都是類和類之間的關係,不涉及到繼承,學的時候應該 記得概括,記得本文最開始的那個圖。觀察者模式很好理解,相似於郵件訂閱和RSS訂閱,當咱們瀏覽一些博客或wiki時,常常會看到RSS圖標,就這的意思是,當你訂閱了該文章,若是後續有更新,會及時通知你。其實,簡單來說就一句話:當一個對象變化時,其它依賴該對象的對象都會收到通知,而且隨着變化!對象之間是一種一對多的關係。先來看看關係圖:


我解釋下這些類的做用:MySubject類就是咱們的主對象,Observer1和Observer2是依賴於MySubject的對象,當MySubject變化時,Observer1和Observer2必然變化。AbstractSubject類中定義着須要監控的對象列表,能夠對其進行修改:增長或刪除被監控對象,且當MySubject變化時,負責通知在列表內存在的對象。咱們看實現代碼:bash

一個Observer接口:ide

public interface Observer {
  public void update();
}
兩個實現類:
public class Observer1 implements Observer {

  @Override
  public void update() {
    System.out.println("observer1 has received!");
  }
}

public class Observer2 implements Observer {

  @Override
  public void update() {
    System.out.println("observer2 has received!");
  }

}

Subject接口及實現類:
public interface Subject {
  
  /*增長觀察者*/
  public void add(Observer observer);
  
  /*刪除觀察者*/
  public void del(Observer observer);
  
  /*通知全部的觀察者*/
  public void notifyObservers();
  
  /*自身的操做*/
  public void operation();
}


public abstract class AbstractSubject implements Subject {

  private Vector<Observer> vector = new Vector<Observer>();
  @Override
  public void add(Observer observer) {
    vector.add(observer);
  }

  @Override
  public void del(Observer observer) {
    vector.remove(observer);
  }

  @Override
  public void notifyObservers() {
    Enumeration<Observer> enumo = vector.elements();
    while(enumo.hasMoreElements()){
      enumo.nextElement().update();
    }
  }
}


public class MySubject extends AbstractSubject {

  @Override
  public void operation() {
    System.out.println("update self!");
    notifyObservers();
  }

}

測試類:
public class ObserverTest {

  public static void main(String[] args) {
    Subject sub = new MySubject();
    sub.add(new Observer1());
    sub.add(new Observer2());
    
    sub.operation();
  }

}
複製代碼

輸出:測試

update self!
observer1 has received!
observer2 has received!spa

相關文章
相關標籤/搜索