觀察者模式又叫做發布-訂閱模式,是物件間的一對多的關係,當一個物件的狀態改變時,所有依賴它的物件都會被通知並被自動更新
#抽象主題角色(Subject
)
也叫抽象目標類,抽象主題知道自己的觀察者有哪些,提供刪除和新增觀察者的方法以及通知觀察者的抽象方法,由抽象類別或介面實作
抽象觀察者角色(Observer
#)
包含了一個更新的抽象方法,當收到特定主題的更新通知後調用,由抽象類別或介面實作
具體主題角色(Concrete Subject
#)
也叫具體目標類,實現抽象目標類的通知方法,當具體主題發生改變時通知所有訂閱自己的觀察者
具體觀察者角色(Concrete Observer
)
#實作抽象觀察者角色的抽象方法,收到主題變更通知後變更自身狀態
抽象觀察者Observer
介面
包含一個觀察者接收通知改變自身狀態方法
public interface Observer { //收到通知,改变自身状态 void update(); }
#具體觀察者ObserverOne
和ObserverTwo
實作Observer介面中的update方法
public class ObserverOne implements Observer{ @Override public void update() { System.out.println("第一个观察者收到通知,状态更新了"); } }
public class ObserverTwo implements Observer { @Override public void update() { System.out.println("第二个观察者收到通知,状态更新了"); } }
#Subject
介面
包含新增,刪除,通知觀察者方法,由抽象目標類別實現,還有一個自身操作的方法,由具體目標類別實現
public interface Subject { //添加观察者 void add(Observer observer); //删除观察者 void remove(Observer observer); //通知所有观察者 void notifyObservers(); //自身操作 void operation(); }
抽象目標類別AbstractSubject
Vector動態數組儲存觀察者,實作Subject介面中的add,remove,notifyObservers方法,operation方法由具體目標類別實作
public abstract class AbstractSubject implements Subject{ Vector<Observer> vector = new Vector<Observer>(); @Override public void add(Observer observer){ vector.add(observer); } @Override public void remove(Observer observer){ vector.remove(observer); } @Override public void notifyObservers(){ for (Observer observer : vector) { observer.update(); } } }
具體目標類別MySubject
在operation方法中呼叫notifyObservers方法以達到自身狀態改變後通知觀察者的效果
public class MySubject extends AbstractSubject{ @Override public void operation() { System.out.println("具体目标状态改变"); System.out.println("正在通知观察者。。。"); notifyObservers(); System.out.println("通知完毕!"); } }
測試類別Test
public class Test { public static void main(String[] args) { MySubject mySubject = new MySubject(); mySubject.add(new ObserverOne()); mySubject.add(new ObserverTwo()); mySubject.operation(); } }總結
觀察者模式主要解決了什麼問題
在低耦合的條件下,一個物件狀態改變,其他物件會收到通知#觀察者模式何時使用
一個物件狀態改變,所有有依賴關係的物件都會收到廣播通知觀察者模式的優點
觀察者和目標是抽象耦合的,低耦合,是一套觸發機制#觀察者模式的缺點
##①如果一個目標中依賴的直接觀察者和間接觀察者有很多的話,通知所有觀察者需要花費很多時間
②如果觀察者和被觀察者之間有循環依賴的話,可能會出現循環調用,導致系統崩潰
③觀察者無法知道目標狀態是如何變化的,只能知道目標狀態發生了改變
以上是JAVA怎樣實現觀察者模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!