Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第 23 题:介绍下观察者模式和订阅-发布模式的区别,各自适用于什么场景 #25

Open
Spades-S opened this issue Feb 28, 2019 · 23 comments

Comments

@Spades-S
Copy link

@Spades-S Spades-S commented Feb 28, 2019

观察者模式中主体和观察者是互相感知的,发布-订阅模式是借助第三方来实现调度的,发布者和订阅者之间互不感知
image

@fingerpan

This comment has been minimized.

Copy link

@fingerpan fingerpan commented Mar 1, 2019

  1. 发布-订阅模式就好像报社, 邮局和个人的关系,报纸的订阅和分发是由邮局来完成的。报社只负责将报纸发送给邮局。
  2. 观察者模式就好像 个体奶农和个人的关系。奶农负责统计有多少人订了产品,所以个人都会有一个相同拿牛奶的方法。奶农有新奶了就负责调用这个方法。
@1042478910

This comment has been minimized.

Copy link

@1042478910 1042478910 commented Mar 1, 2019

可不可以理解 为 观察者模式没中间商赚差价
发布订阅模式 有中间商赚差价

@GitHdu

This comment has been minimized.

Copy link

@GitHdu GitHdu commented Mar 2, 2019

观察者模式依赖一旦改变就会触发更新,而订阅发布模式则需要手动触发更新

@alanchanzm

This comment has been minimized.

Copy link

@alanchanzm alanchanzm commented Mar 2, 2019

联系

发布-订阅模式是观察者模式的一种变体。发布-订阅只是把一部分功能抽象成一个独立的ChangeManager。

意图

都是某个对象(subject, publisher)改变,使依赖于它的多个对象(observers, subscribers)得到通知。

区别与适用场景

总的来说,发布-订阅模式适合更复杂的场景。

在「一对多」的场景下,发布者的某次更新只想通知它的部分订阅者?

在「多对一」或者「多对多」场景下。一个订阅者依赖于多个发布者,某个发布者更新后是否需要通知订阅者?还是等所有发布者都更新完毕再通知订阅者?

这些逻辑都可以放到ChangeManager里。

@fingerpan

This comment has been minimized.

Copy link

@fingerpan fingerpan commented Mar 4, 2019

vue 中的 observer watcher dep 可以理解为发布订阅者模式吧?

应该是观察者模式。 vue的事件通讯机制才是发布订阅模式

@rocky-191

This comment has been minimized.

Copy link

@rocky-191 rocky-191 commented Mar 6, 2019

vue 中的 observer watcher dep 可以理解为发布订阅者模式吧?

应该是观察者模式。 vue的事件通讯机制才是发布订阅模式

数据劫持+发布订阅

@fingerpan

This comment has been minimized.

Copy link

@fingerpan fingerpan commented Mar 6, 2019

vue 中的 observer watcher dep 可以理解为发布订阅者模式吧?

应该是观察者模式。 vue的事件通讯机制才是发布订阅模式

数据劫持+发布订阅

从命名上就可以区别,观察者(observer)和主题(subject)对象

@qiuguixin

This comment has been minimized.

Copy link

@qiuguixin qiuguixin commented Apr 20, 2019

观察者模式为一刀切模式,对所有订阅者一视同仁
发布订阅模式 可以戴有色眼镜,有一层过滤或者说暗箱操作😄

@vian94

This comment has been minimized.

@halionn

This comment has been minimized.

Copy link

@halionn halionn commented Jun 18, 2019

发布-订阅增加了一个中介者,发布者和订阅着只和中介者打交到。中介者持有发布者和订阅者都引用或传入的回调,用来做订阅和通知。

@xxxin128

This comment has been minimized.

Copy link

@xxxin128 xxxin128 commented Jul 10, 2019

观察者模式由具体目标调度,每个被订阅的目标里面都需要有对观察者的处理,会造成代码的冗余。而发布订阅模式则统一由调度中心处理,消除了发布者和订阅者之间的依赖。

@monw3c

This comment has been minimized.

Copy link

@monw3c monw3c commented Jul 11, 2019

低耦合和完全解藕

@Hunterang

This comment has been minimized.

Copy link

@Hunterang Hunterang commented Jul 11, 2019

多个发布订阅构成观察者模式,触发条件的话,感觉都是类似监听的方式,区别不明显

@PatrickLh

This comment has been minimized.

Copy link

@PatrickLh PatrickLh commented Jul 11, 2019

参考了Java的部分实现,观察者模式代码如下:

var subject = {
	observers: [],
	notify() {
		this.observers.forEach(observer =>{
			observer.update()
		})
	},
	attach (observer) {
		this.observers.push(observer)
	}
}
var observer = {
	update(){
		alert('updated')
	}
}
subject.attach(observer)
subject.notify()

而使用订阅发布模式,使用中间订阅发布对象的方式如下

var publisher = {
	publish(pubsub) {
		pubsub.publish()
	}
}
var pubsub = {
	subscribes: [],
	publish() {
		this.subscribes.forEach(subscribe =>{
			subscribe.update();
		})
	},
	subscribe(sub) {
		this.subscribes.push(sub)
	}
}
var subscribe = {
	update() {
		console.log('update')
	},
        subscribe(pubsub) {
            pubsub.subscribe(this);
        }
}
subscribe.subscribe(pubsub)
publisher.publish(pubsub)

自己认为,两种模式本质都是一样的,主要关键点都在于注册(添加到注册数组中)和触发(触发注册数组中的内容),只是订阅/发布模式对注册和触发进行了解耦。可以看到,使用订阅发布模式中发布者触发publish的时候,可以选择触发哪一些订阅者集合(因为publish参数传递了中间集合,可以定义多个pubsub集合),而观察者模式则只能触发所有的被观察对象。

@xufeiayang

This comment has been minimized.

Copy link

@xufeiayang xufeiayang commented Jul 16, 2019

vue 中的 observer watcher dep 可以理解为发布订阅者模式吧?

应该是观察者模式。 vue的事件通讯机制才是发布订阅模式

vue双向绑定过程涉及发布订阅和观察者,setter是观察者,更新的过程是发布订阅

@Yxiuchao

This comment has been minimized.

Copy link

@Yxiuchao Yxiuchao commented Jul 16, 2019

应该是发布订阅模式吧,订阅发布模式说的应该和观察者模式是同一个模式的两种叫法吧

@zhishaofei3

This comment has been minimized.

Copy link

@zhishaofei3 zhishaofei3 commented Jul 17, 2019

参考了Java的部分实现,观察者模式代码如下:

var subject = {
	observers: [],
	notify() {
		this.observers.forEach(observer =>{
			observer.update()
		})
	},
	attach (observer) {
		this.observers.push(observer)
	}
}
var observer = {
	update(){
		alert('updated')
	}
}
subject.attach(observer)
subject.notify()

而使用订阅发布模式,使用中间订阅发布对象的方式如下

var publisher = {
	publish(pubsub) {
		pubsub.publish()
	}
}
var pubsub = {
	subscribes: [],
	publish() {
		this.subscribes.forEach(subscribe =>{
			subscribe.update();
		})
	},
	subscribe(sub) {
		this.subscribes.push(sub)
	}
}
var subscribe = {
	update() {
		console.log('update')
	},
        subscribe(pubsub) {
            pubsub.subscribe(this);
        }
}
subscribe.subscribe(pubsub)
publisher.publish(pubsub)

自己认为,两种模式本质都是一样的,主要关键点都在于注册(添加到注册数组中)和触发(触发注册数组中的内容),只是订阅/发布模式对注册和触发进行了解耦。可以看到,使用订阅发布模式中发布者触发publish的时候,可以选择触发哪一些订阅者集合(因为publish参数传递了中间集合,可以定义多个pubsub集合),而观察者模式则只能触发所有的被观察对象。

还是看代码清楚

@zacard-orc

This comment has been minimized.

Copy link

@zacard-orc zacard-orc commented Jul 24, 2019

可不可以理解 为 观察者模式没中间商赚差价
发布订阅模式 有中间商赚差价

确定是赚了差价吗,应该算是亏本买卖吧,毕竟有投入的

@daiyunchao

This comment has been minimized.

Copy link

@daiyunchao daiyunchao commented Aug 16, 2019

观察者模式就像 mvvm ,m的变化v可以感知而对应的做出变化(不是很准确,因为观察者是单向的)
而订阅发布模式就像mvc m的变化必须依靠c来控制通知view model有变化,view才做出相应

@atJiangBei

This comment has been minimized.

Copy link

@atJiangBei atJiangBei commented Sep 24, 2019

我的回答:观察者模式: 假如现在有一个楼盘将要开盘(这个楼盘是一个主体,里面有销售人员,有保安人员等等), 然后有很多人(很多观察者)来买房,然后这些人把自己的电话留在售楼部(每个观察者都把自己注册到目标), 当确定楼盘开盘日期的时候,就由售楼部的销售人员通知这些留下电话的买房的人。 在这里,买房的人必须把自己的电话号码留在售楼部(观察者必须把自己注册到主体里), 不然楼盘的销售人员是无法通知要买房的人的,这之间就产生了联系。 发布订阅模式: 假设有一个中介,有很多想把自己的房子卖了的人,就把自己的房产信息留下。 然后有很多想要买二手房的人,把自己的电话也留在了中介。 这之间,买房的和卖房的一点关系都没有,谁都不知道谁的存在,买房的等着中介通知它有没有房。

@zhangyu0218

This comment has been minimized.

Copy link

@zhangyu0218 zhangyu0218 commented Oct 21, 2019

应用到react上 ,观察者模式是不是就像父子组件传值 而发布订阅模式就像是组件之间信息通过redux传递呢。

@Longgererer

This comment has been minimized.

Copy link

@Longgererer Longgererer commented Oct 22, 2019

观察者模式和发布订阅模式都有观察者和发布这两个对象

观察者模式没有中介,发布者和订阅者必须知道对方的存在

发布订阅模式有中介,发布者和订阅者不需要知道对方是谁,只要通过中介进行信息的传递和过滤就可以了

这是最大的不同

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
You can’t perform that action at this time.