行爲模式--觀察者模式

算是讀書筆記吧

極客時間--設計模式之美


觀察者模式

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
在對象之間定義一個一對多的依賴,當一個對象狀態改變的時候,所有依賴的對象都會自動收到通知。

觀察者模式(Observer Design Pattern)也被稱爲發佈訂閱模式(Publish-Subscribe Design Pattern)

一般情況下,被依賴的對象叫作被觀察者(Observable)依賴的對象叫作觀察者(Observer)

經典的觀察者模式

經典的觀察者模式很簡單,被觀察者持有一個列表,其中保存着觀察者們。
在適當的時機,將想要發送的消息,通過遍歷列表的方式對應的方法通知觀察者們。


public interface Subject {
  void registerObserver(Observer observer);
  void removeObserver(Observer observer);
  void notifyObservers(Message message);
}

public class ConcreteSubject implements Subject {
  private List<Observer> observers = new ArrayList<Observer>();

  @Override
  public void registerObserver(Observer observer) {
    observers.add(observer);
  }

  @Override
  public void removeObserver(Observer observer) {
    observers.remove(observer);
  }

  @Override
  public void notifyObservers(Message message) {
    for (Observer observer : observers) {
      observer.update(message);
    }
  }
\
}

在新增聯動事件時,只需要再添加一個實現了 Observer 接口的類,並且通過 registerObserver() 函數將它註冊到 ConcreteSubject 類中即可,並不需要修改 ConcreteSubject 內部函數。
達到讓主類 ConcreteSubject 滿足開閉原則的目的。


生產者 - 消費者模型

1、你把信寫好——相當於生產者製造數據

2、你把信放入郵筒——相當於生產者把數據放入緩衝區

3、郵遞員把信從郵筒取出——相當於消費者把數據取出緩衝區

4、郵遞員把信拿去郵局做相應的處理——相當於消費者處理數據

與經典觀察者模式的區別

  1. 阻塞方式不同
    由於中間件的存在,生產者 - 消費者模型是天生的異步調用
  2. 對應關係不同
    生產者 - 消費者模型中的數據單元是一對一(消息由一個生產者產出,被一個消費者消費)
    生產者 - 消費者模型中的生產者與消費者是多對多(隨機生產者生產的消息,被隨機的消費者消費)
    觀察者模式是一對多(一個被觀察者生產的消息,被多個觀察者消費)

異步的觀察者模式

最簡單的異步觀察者實現就是將 notifyObservers 改爲異步調用。

當然也有很多成熟的異步觀察者模式框架,比如EventBus、RxJava、RxBus等等。

通常他們也有一箇中間者負責管理註冊表,其中有很多併發的安全處理、查找算法等等各項優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章