觀察者模式,是對象行爲型模式中的一種,有的時候人們也叫他發佈/訂閱模式。當咱們須要在一個對象狀態改變的時候通知到其它對象,這時候就能夠考慮一下觀察者模式。java
在設計模式中,觀察者模式的主旨則是定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。設計模式
在上面咱們說到,有時觀察者模式也稱發佈/訂閱模式,那到底有啥區別呢?其實發布訂閱模式是處於廣義上的觀察者模式,由於他是最經常使用的一種觀察者模式的實現。安全
發佈訂閱模式相對觀察者多了一個事件的通道,由於在觀察者模式中,觀察者(Observer)須要直接訂閱目標(Subject)事件,在目標發出內容更改事件時,直接接收內容事件並作出響應。在發佈訂閱模式中訂閱者須要從時間的通道中訂閱事件,這樣從發佈者接收事件以及向訂閱者發佈事件,二者並無產生依賴的關係。多線程
具體代碼上的區別,有興趣的朋友能夠在下方留言,下次能夠出一個小分支。異步
在上面的介紹中,咱們大概知道了在觀察者模式中,有這麼兩種主角色:ide
被觀察者必需要有添加觀察者、刪除觀察者和提醒觀察者的方法。測試
觀察者要有更新方法,用來作出響應在狀態改變調用提醒方法後。spa
Java中已經提供了觀察者模式的實現,咱們不須要再定義觀察者和目標接口(被觀察者),也不須要維護觀察者的註冊信息。能夠繼承Observable類實現被觀察者目標對象,實現Observer接口完成具體的觀察者對象,其中提供了update方法獲取相應事件信息。線程
在這裏爲了方便說明觀察者的基本原理,本身實現一個簡單的案例。設計
首先抽象一個觀察者類,裏面有一個抽象方法更新狀態。
public abstract class Oberver{ public abstract void Update(); }
而後再寫一個抽象被觀察者類。
public abstract class Subject{ //增長 public abstract void Attach(Observer observer); //移除 public abstract void Detach(Observer observer); //通知 public abstract void Notify(); }
具體上面兩個類:
//具體的觀察者 public class ConcreteObserver extends Observer{ @Override public void Update() { System.out.println("狀態改變,更新狀態"); } } //具體被觀察者類 public class ConcreteSubject extends Subject { //定義集合存儲觀察者 List<Observer> list=new ArrayList<Observer>(); //增長觀察者 @Override public void Attach(Observer observer) { list.add(observer); } @Override public void Detach(Observer observer) { list.add(observer); } @Override public void Notify() { //遍歷集合觀察者對象 for(Observer observer:list){ observer.Update(); } } }
接下來咱們就能夠寫測試類了:
public class ObserverDemo { public static void main(String[] args) { //建立被觀察者對象 ConcreteSubject csb=new ConcreteSubject(); //建立觀察者對象 ConcreteObserver cob=new ConcreteObserver(); //將觀察者添加到被觀察者的通知名單內 csb.Attach(cob); //被觀察者發出通知,觀察者接受通知更新狀態 csb.Notify(); } } //輸出 「狀態改變,更新狀態」
就這樣,一個簡單的觀察者模式的案例就結束了。固然一個複雜的應用中,咱們確定須要一個完整並且適用與多線程以及異步系統,由於觀察者模式大都應用與這兩中系統,因此也須要考慮線程安全的問題。下次會介紹更加詳細完整的觀察者的實現方式。
由於每一篇的篇幅不宜過長,因此本打字員儘可能在精簡本身所寫的內容,儘可能可以多容擴一些知識點,可是具體的知識橫向擴展可能就有一點欠缺,這也算是對本身的一種鍛鍊,但願你們可以一塊兒進步,怎麼樣,在下面留個言吐槽一下本渣渣吧。(逃