行为模式--观察者模式

算是读书笔记吧

极客时间--设计模式之美


观察者模式

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等等。

通常他们也有一个中间者负责管理注册表,其中有很多并发的安全处理、查找算法等等各项优化。

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