发布订阅模式和观察者模式区别

一 观察者模式

观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。

简单实现就是被观察者里面存储了观察者的对象列表,当被观察者发生某种行为时,会回调观察者的方法。抽象代码如下:

public abstract class Subject {
    private List<Observer> observers=new ArrayList<Observer>();//用于保存已订阅的目标的观察者
    public void attach(Observer observer){//订阅目标对象
        observers.add(observer);
    }
    public void detach(Observer observer){//解除订阅关系
        observers.remove(observer);
    }
    protected void notifyObserver(){//通知已订阅的观察者
        for (Observer observer : observers) {
            observer.updata(this);
        }
    }
}

二 发布订阅模式

在软件架构中,发布-订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如果有的话)存在。

在这里插入图片描述
完成订阅发布整个流程需要三个角色:

  • 发布者
  • 事件中心
  • 订阅者

三 观察者模式与发布订阅模式区别

先一张图看看这两者的区别:
在这里插入图片描述

可以看出,发布订阅模式相比观察者模式多了个事件通道,事件通道作为调度中心,管理事件的订阅和发布工作,彻底隔绝了订阅者和发布者的依赖关系。即订阅者在订阅事件的时候,只关注事件本身,而不关心谁会发布这个事件;发布者在发布事件的时候,只关注事件本身,而不关心谁订阅了这个事件。

观察者模式有两个重要的角色,即目标和观察者。在目标和观察者之间是没有事件通道的。一方面,观察者要想订阅目标事件,由于没有事件通道,因此必须将自己添加到目标(Subject)
中进行管理;另一方面,目标在触发事件的时候,也无法将通知操作(notify) 委托给事件通道,因此只能亲自去通知所有的观察者。

差异总结:

  • 角色角度来看,订阅发布模式需要三种角色,发布者、事件中心和订阅者。二观察者模式需要两种角色,目标和观察者,无事件中心负责通信。
  • 从耦合度上来看,订阅发布模式是一个事件中心调度模式,订阅者和发布者是没有直接关联的,通过事件中心进行关联,两者是解耦的。而观察者模式中目标和观察者是直接关联的,耦合在一起(有些观念说观察者是解耦,解耦的是业务代码,不是目标和观察者本身)。

四 观察者模式与发布订阅模式优缺点

订阅发布模式优点
灵活
由于订阅发布模式的发布者和订阅者是解耦的,只要引入订阅发布模式的事件中心,无论在何处都可以发布订阅。同时订阅发布者相互之间不影响。

订阅发布模式在使用不当的情况下,容易造成数据流混乱,所以才有了 React 提出的单项数据流思想,就是为了解决数据流混乱的问题。

订阅发布模式缺点
容易导致代码不好维护
灵活是有点,同时也是缺点,使用不当就会造成数据流混乱,导致代码不好维护。

性能消耗更大
订阅发布模式需要维护事件列队,订阅的事件越多,内存消耗越大。

观察者模式优点
响应式
目标变化就会通知观察者,这是观察者最大的有点,也是因为这个优点,观察者模式在前端才会这么出名。

观察者模式缺点
不灵活
相比订阅发布模式,由于目标和观察者是耦合在一起的,所以观察者模式需要同时引入目标和观察者才能达到响应式的效果。而订阅发布模式只需要引入事件中心,订阅者和发布者可以不再一处。

参考:
https://segmentfault.com/a/1190000020169229
https://www.cnblogs.com/onepixel/p/10806891.html

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