算是讀書筆記吧
極客時間--設計模式之美
觀察者模式
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、郵遞員把信拿去郵局做相應的處理——相當於消費者處理數據
與經典觀察者模式的區別
- 阻塞方式不同
由於中間件的存在,生產者 - 消費者模型是天生的異步調用 - 對應關係不同
生產者 - 消費者模型中的數據單元是一對一(消息
由一個生產者產出,被一個消費者消費)
生產者 - 消費者模型中的生產者與消費者是多對多(隨機生產者生產的消息
,被隨機的消費者消費)
觀察者模式是一對多(一個被觀察者生產的消息
,被多個觀察者消費)
異步的觀察者模式
最簡單的異步觀察者實現就是將 notifyObservers 改爲異步調用。
當然也有很多成熟的異步觀察者模式框架,比如EventBus、RxJava、RxBus等等。
通常他們也有一箇中間者負責管理註冊表,其中有很多併發的安全處理、查找算法等等各項優化。