觀察者模式:所謂觀察者模式晦墙,其實(shí)就是為了實(shí)現(xiàn)松耦合(loosely coupled)悦昵。
發(fā)布訂閱者模式:發(fā)布訂閱模式里,發(fā)布者和訂閱者晌畅,不是松耦合但指,而是完全解耦的。在發(fā)布訂閱模式里抗楔,發(fā)布者棋凳,并不會(huì)直接通知訂閱者,換句話說(shuō)连躏,發(fā)布者和訂閱者剩岳,彼此互不相識(shí)
使用觀察者模式,面向接口編程入热,實(shí)現(xiàn)松耦合拍棕。
觀察者模式里面,changed()方法所在的實(shí)例對(duì)象勺良,就是被觀察者(Subject绰播,或者叫Observable),它只需維護(hù)一套觀察者(Observer)的集合尚困,這些Observer實(shí)現(xiàn)相同的接口蠢箩,Subject只需要知道,通知Observer時(shí)事甜,需要調(diào)用哪個(gè)統(tǒng)一方法就好了:
發(fā)布訂閱模式
大概很多人都和我一樣谬泌,覺(jué)得發(fā)布訂閱模式里的Publisher,就是觀察者模式里的Subject逻谦,而Subscriber呵萨,就是Observer。Publisher變化時(shí)跨跨,就主動(dòng)去通知Subscriber潮峦。
其實(shí)是:
發(fā)布者只需告訴Broker,我要發(fā)的消息勇婴,topic是AAA忱嘹;
訂閱者只需告訴Broker,我要訂閱topic是AAA的消息耕渴;
總結(jié)
從表面上看:
觀察者模式里拘悦,只有兩個(gè)角色 —— 觀察者 + 被觀察者
而發(fā)布訂閱模式里,卻不僅僅只有發(fā)布者和訂閱者兩個(gè)角色橱脸,還有一個(gè)經(jīng)常被我們忽略的 —— 經(jīng)紀(jì)人Broker
往更深層次講:
觀察者和被觀察者础米,是松耦合的關(guān)系
發(fā)布者和訂閱者分苇,則完全不存在耦合
從使用層面上講:
觀察者模式,多用于單個(gè)應(yīng)用內(nèi)部
發(fā)布訂閱模式屁桑,則更多的是一種跨應(yīng)用的模式(cross-application pattern)医寿,比如我們常用的消息中間件
詳解:https://link.zhihu.com/?target=https%3A//hackernoon.com/observer-vs-pub-sub-pattern-50d3b27f838c