java之觀察者模式
阿新 • • 發佈:2019-01-24
觀察者模式(Observer) 包括這個模式在內的接下來的四個模式,都是類和類之間的關係,不涉及到繼承,學的時候應該 記得歸納 ,記得本文最開始的那個圖。觀察者模式很好理解,類似於郵件訂閱和RSS訂閱, 當我們瀏覽一些部落格或wiki時,經常會看到RSS圖示,就這的意思是,當你訂閱了該文章, 如果後續有更新,會及時通知你。其實,簡單來講就一句話:當一個物件變化時, 其它依賴該物件的物件都會收到通知,並且隨著變化!物件之間是一種一對多的關係 我解釋下這些類的作用:MySubject類就是我們的主物件,Observer1和Observer2是依賴於MySubject的物件, 當MySubject變化時,Observer1和Observer2必然變化。AbstractSubject類中定義著需要監控的物件列表, 可以對其進行修改:增加或刪除被監控物件,且當MySubject變化時,負責通知在列表記憶體在的物件。我們看實現程式碼: 一個Observer介面: 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!