包括這個模式在內的接下來的四個模式,都是類和類之間的關係,不涉及到繼承,學的時候應該 記得概括,記得本文最開始的那個圖。觀察者模式很好理解,相似於郵件訂閱和RSS訂閱,當咱們瀏覽一些博客或wiki時,常常會看到RSS圖標,就這的意思是,當你訂閱了該文章,若是後續有更新,會及時通知你。其實,簡單來說就一句話:當一個對象變化時,其它依賴該對象的對象都會收到通知,而且隨着變化!對象之間是一種一對多的關係。先來看看關係圖:java
我解釋下這些類的做用:MySubject類就是咱們的主對象,Observer1和Observer2是依賴於MySubject的對象,當MySubject變化時,Observer1和Observer2必然變化。AbstractSubject類中定義着須要監控的對象列表,能夠對其進行修改:增長或刪除被監控對象,且當MySubject變化時,負責通知在列表內存在的對象。咱們看實現代碼:ide
一個Observer接口:測試
public interface Observer { public void update(); }
兩個實現類:code
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接口及實現類:server
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!接口
這些東西,其實不難,只是有些抽象,不太容易總體理解,建議讀者:根據關係圖,新建項目,本身寫代碼(或者參考個人代碼),按照整體思路走一遍,這樣才能體會它的思想,理解起來容易! 內存