算是读书笔记吧
极客时间--设计模式之美
观察者模式
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等等。
通常他们也有一个中间者负责管理注册表,其中有很多并发的安全处理、查找算法等等各项优化。