学习观察者模式与发布/订阅模式 港控/mmm° 2022-01-20 03:55 298阅读 0赞 > 最近学习了**观察者模式**和**发布/订阅模式**,但是一直有种不得要领的感觉,今天重新复习了一遍又有了新的思考,记录一下学习收获。 ## 观察者模式 ## 概念引用原文的话如下: > The Observer is a design pattern where an object (known as a subject) maintains a list of objects depending on it (observers), automatically notifying them of any changes to state. > 一个对象(subject)维护一个对象列表(observers),当发生任何状态改变时自动通知它们 根据概念画了一个大概的关系图 接下来直接看看代码的实现 先是一个observeList类,这个类有几个维护observerList的方法,这几个方法是用来管理对象维护的观察者列表的方法(类似增删改查)。 function ObserverList(){ this.observerList = []; } ObserverList.prototype.add = function( obj ){ return this.observerList.push( obj ); }; ObserverList.prototype.count = function(){ return this.observerList.length; }; ObserverList.prototype.get = function( index ){ if( index > -1 && index < this.observerList.length ){ return this.observerList[ index ]; } }; ObserverList.prototype.indexOf = function( obj, startIndex ){ var i = startIndex; while( i < this.observerList.length ){ if( this.observerList[i] === obj ){ return i; } i++; } return -1; }; ObserverList.prototype.removeAt = function( index ){ this.observerList.splice( index, 1 ); }; 复制代码 接下来是subject类,用于给某个具体的被观察的对象继承,这个类有包装了新增观察者(addObserver)、移除观察者(removeObserver)以及通知观察者(notify)的方法。 function Subject(){ this.observers = new ObserverList(); } Subject.prototype.addObserver = function( observer ){ this.observers.add( observer ); }; Subject.prototype.removeObserver = function( observer ){ this.observers.removeAt( this.observers.indexOf( observer, 0 ) ); }; Subject.prototype.notify = function( context ){ var observerCount = this.observers.count(); for(var i=0; i < observerCount; i++){ this.observers.get(i).update( context ); } }; 复制代码 最后是一个观察者的类,这个其实并不是强制要求以这个类来实现,只是说明了观察者需要暴露一个update方法,当subject的实例发生变化时,subject实例使用notify方法去调用观察者的update方法。 function Observer(){ this.update = function(){ // ... }; } 复制代码 刚开始看观察者模式的时候一直不是很明白这个设计在开发中的应用,今天又重新看的时候忽然想起来和之前看vue的双向绑定一部分的实现很像。在双向绑定里当我们改变一个对象的值的时候,其他使用了这个值的地方也会对应改变,这和观察者模式的设计是比较类似的。 ## 发布/订阅模式 ## 发布/订阅模式和观察者模式有点类似,但是发布/订阅模式不存在观察者与被观察者的关系,这种设计模式相对于观察者模式更加的松耦合,实现代码如下: 一个对象如果提供了支持Publish()、Subscribe()和unsubscribe()的功能实现,就可以使用Publish/Subscribe。 var pubsub = {}; (function(myObject) { // Storage for topics that can be broadcast // or listened to var topics = {}; // A topic identifier var subUid = -1; // Publish or broadcast events of interest // with a specific topic name and arguments // such as the data to pass along myObject.publish = function( topic, args ) { if ( !topics[topic] ) { return false; } var subscribers = topics[topic], len = subscribers ? subscribers.length : 0; while (len--) { subscribers[len].func( topic, args ); } return this; }; // Subscribe to events of interest // with a specific topic name and a // callback function, to be executed // when the topic/event is observed myObject.subscribe = function( topic, func ) { if (!topics[topic]) { topics[topic] = []; } var token = ( ++subUid ).toString(); topics[topic].push({ token: token, func: func }); return token; }; // Unsubscribe from a specific // topic, based on a tokenized reference // to the subscription myObject.unsubscribe = function( token ) { for ( var m in topics ) { if ( topics[m] ) { for ( var i = 0, j = topics[m].length; i < j; i++ ) { if ( topics[m][i].token === token ) { topics[m].splice( i, 1 ); return token; } } } } return this; }; }( pubsub )); 复制代码 发布/订阅模式和vue的eventBus异曲同工,在实际应用中,因为任何地方我们都可以订阅(subscribe)一个事件,也可以在任何地方发布(public)一个事件,所以在这个设计模式中,谁发布或者谁订阅了事件是无法感知的,这也是和观察者模式最大的区别。 ## 总结 ## 刚开始学习观察者模式和发布/订阅模式真的是完全没有什么感觉,简单的说的就是代码都看懂了,但是不知道有什么用。今天重新看了一遍,仔细想了一下设计的用法,和实际开发中对应起来就特别有感觉了,学习设计模式对于我们阅读源码和开发中体会框架的设计理念非常有帮助。 -------------------- 参考文档:[addyosmani.com/resources/e…][addyosmani.com_resources_e] [addyosmani.com_resources_e]: https://link.juejin.im?target=https%3A%2F%2Faddyosmani.com%2Fresources%2Fessentialjsdesignpatterns%2Fbook%2F%23observerpatternjavascript
相关 观察者模式与订阅发布模式的区别 1、观察者模式 观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式 水深无声/ 2023年10月07日 20:01/ 0 赞/ 69 阅读
相关 观察者模式 vs 发布订阅模式 目录 场景 观察者模式 发布订阅模式 总结 -------------------- 场景 有一回面试,面试官问: 末蓝、/ 2023年10月06日 19:03/ 0 赞/ 30 阅读
相关 【JavaScript 设计模式】观察者模式与发布订阅模式 JavaScript 设计模式系列文章: [设计模式总览][Link 1] [工厂模式][Link 2] [单例模式][Link 3] [观察者模式/ Bertha 。/ 2022年12月04日 07:58/ 0 赞/ 248 阅读
相关 订阅发布和观察者模式 发布订阅模式 > 把多个方法暂存起来,最后一次触发执行 作用: 解偶 使用场景: 如,多个类或者函数内,可以分散订阅某个操作,最后统一发布。分散的好处就是不 ╰+攻爆jí腚メ/ 2022年08月28日 14:47/ 0 赞/ 222 阅读
相关 观察者模式(发布-订阅者模式) 观察者模式定义了一种依赖关系,解决了主体对象和观察者之间功能的耦合,主要应用于大型项目的模块化开发中,解决团队开发中模块之间的通信问题,利用观察者模式还可以实现自定义事件。 素颜马尾好姑娘i/ 2022年05月22日 06:00/ 0 赞/ 236 阅读
相关 设计模式之观察者模式(发布订阅模式) 说明:本文参照《大话设计模式》中的案例做简要解析 观察者模式: 又叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。 深藏阁楼爱情的钟/ 2022年05月21日 10:39/ 0 赞/ 284 阅读
相关 javascript 观察者模式 发布订阅模式 观察者模式 观察者模式,每一个观察者对象有两个方法 添加监听`subscribe` 发布事件`publish` 观察者有个`list`存放所有的已经添加监 本是古典 何须时尚/ 2022年04月24日 10:14/ 0 赞/ 230 阅读
相关 学习观察者模式与发布/订阅模式 > 最近学习了观察者模式和发布/订阅模式,但是一直有种不得要领的感觉,今天重新复习了一遍又有了新的思考,记录一下学习收获。 观察者模式 概念引用原文的话如下: > T 港控/mmm°/ 2022年01月20日 03:55/ 0 赞/ 299 阅读
相关 发布订阅模式(观察者模式) 设计模式的目的就是使类成为可复用的组件。 在观察者模式中观察者接口只注重被观察者,而被观察者接口只注重观察者,具体是观察者接口实现类中的哪一个并不在意,而被观察者也是如此。这 清疚/ 2021年12月15日 00:27/ 0 赞/ 311 阅读
还没有评论,来说两句吧...