You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constsubject=newSubject();constobserverA=newObserver('observerA',subject);constobserverB=newObserver('observerB');subject.addObserver(observerB);subject.notifyObservers('Hello from subject');subject.removeObserver(observerA);subject.notifyObservers('Hello again');
constTYPE_A='music';constTYPE_B='movie';constTYPE_C='novel';constpubsub=newPubSub();constpublisherA=newPublisher('publisherA',pubsub);publisherA.publish(TYPE_A,'we are young');publisherA.publish(TYPE_B,'the silicon valley');constpublisherB=newPublisher('publisherB',pubsub);publisherB.publish(TYPE_A,'stronger');constpublisherC=newPublisher('publisherC',pubsub);publisherC.publish(TYPE_C,'a brief history of time');constsubscriberA=newSubscriber('subscriberA',pubsub);subscriberA.subscribe(TYPE_A,res=>{console.log('subscriberA received',res)});constsubscriberB=newSubscriber('subscriberB',pubsub);subscriberB.subscribe(TYPE_C,res=>{console.log('subscriberB received',res)});constsubscriberC=newSubscriber('subscriberC',pubsub);subscriberC.subscribe(TYPE_B,res=>{console.log('subscriberC received',res)});pubsub.notify(TYPE_A);pubsub.notify(TYPE_B);pubsub.notify(TYPE_C);
一、观察者模式
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新
观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯
例如生活中,我们可以用报纸期刊的订阅来形象的说明,当你订阅了一份报纸,每天都会有一份最新的报纸送到你手上,有多少人订阅报纸,报社就会发多少份报纸
报社和订报纸的客户就形成了一对多的依赖关系
实现代码如下:
被观察者模式
观察者:
使用代码如下:
上述代码中,观察者主动申请加入被观察者的列表,被观察者主动将观察者加入列表
二、发布订阅模式
发布-订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在
同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者存在
实现代码如下:
发布者代码如下:
订阅者代码如下:
使用代码如下:
上述代码,发布者和订阅者需要通过发布订阅中心进行关联,发布者的发布动作和订阅者的订阅动作相互独立,无需关注对方,消息派发由发布订阅中心负责
三、区别
两种设计模式思路是一样的,举个生活例子:
上述过程中,如果公司自己去管理快递的配送,那公司就会变成一个快递公司,业务繁杂难以管理,影响公司自身的主营业务,因此使用何种模式需要考虑什么情况两者是需要耦合的
两者区别如下图:
在观察者模式中,观察者是知道Subject的,Subject一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过消息代理进行通信。
在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。
观察者模式大多数时候是同步的,比如当事件触发,Subject就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列)
参考文献
The text was updated successfully, but these errors were encountered: