最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

javascript观察者模式定义、场景实例代码详解

来源:懂视网 责编:小采 时间:2020-11-27 20:15:19
文档

javascript观察者模式定义、场景实例代码详解

javascript观察者模式定义、场景实例代码详解:观察者模式定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新,也被称为是发布订阅模式。它需要一种高级的抽象策略,以便订阅者能够彼此独立地发生改变,而发行方能够接受任何有消费意向的订阅者。
推荐度:
导读javascript观察者模式定义、场景实例代码详解:观察者模式定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新,也被称为是发布订阅模式。它需要一种高级的抽象策略,以便订阅者能够彼此独立地发生改变,而发行方能够接受任何有消费意向的订阅者。

观察者模式

定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新,也被称为是发布订阅模式。

它需要一种高级的抽象策略,以便订阅者能够彼此独立地发生改变,而发行方能够接受任何有消费意向的订阅者。

应用场景:  

这个模式要先说应用场景,比较好理解。

打一个离我们比较近的一个场景,博客园里面有一个订阅的按钮(貌似有bug),比如小A,小B,小C都订阅了我的博客,当我的博客一有更新时,就会统一发布邮件给他们这三个人,就会通知这些订阅者

发布订阅模式的流程如下:

1. 确定谁是发布者(比如我的博客)。

2. 然后给发布者添加一个缓存列表,用于存放回调函数来通知订阅者。

3. 发布消息,发布者需要遍历这个缓存列表,依次触发里面存放的订阅者回调函数。

4. 退订(比如不想再接收到这些订阅的信息了,就可以取消掉)

代码如下:

var pubsub = {}; // 定义发布者
(function (q) {
 var list = [], //回调函数存放的数组,也就是记录有多少人订阅了我们东西
 subUid = -1;
 // 发布消息,遍历订阅者
 q.publish = function (type, content) {
 // type 为文章类型,content为文章内容
 // 如果没有人订阅,直接返回
 if (!list[type]) {
 return false;
 }
 setTimeout(function () {
 var subscribers = list[type],
 len = subscribers ? subscribers.length : 0;
 
 while (len--) {
 // 将内容注入到订阅者那里
 subscribers[len].func(type, content);
 }
 }, 0);
 return true;
 };
 //订阅方法,由订阅者来执行
 q.subscribe = function (type, func) {
 // 如果之前没有订阅过
 if (!list[type]) {
 list[type] = [];
 }
 // token相当于订阅者的id,这样的话如果退订,我们就可以针对它来知道是谁退订了。
 var token = (++subUid).toString();
 // 每订阅一个,就把它存入到我们的数组中去
 list[type].push({
 token: token,
 func: func
 });
 return token;
 };
 //退订方法
 q.unsubscribe = function (token) {
 for (var m in list) {
 if (list[m]) {
 for (var i = 0, j = list[m].length; i < j; i++) {
 if (list[m][i].token === token) {
 list[m].splice(i, 1);
 return token;
 }
 }
 }
 }
 return false;
 };
} (pubsub));
//将订阅赋值给一个变量,以便退订
var girlA = pubsub.subscribe('js类的文章', function (type, content) {
 console.log('girlA订阅的'+type + ": 内容内容为:" + content);
});
var girlB = pubsub.subscribe('js类的文章', function (type, content) {
 console.log('girlB订阅的'+type + ": 内容内容为:" + content);
});
var girlC = pubsub.subscribe('js类的文章', function (type, content) {
 console.log('girlC订阅的'+type + ": 内容内容为:" + content);
});
//发布通知
pubsub.publish('js类的文章', '关于js的内容');
// 
输出: // girlC订阅的js类的文章: 内容内容为:关于js的内容 // test3.html:78 girlB订阅的js类的文章: 内容内容为:关于js的内容 // test3.html:75 girlA订阅的js类的文章: 内容内容为:关于js的内容 //girlA退订了关于js类的文章 setTimeout(function () { pubsub.unsubscribe(girlA); }, 0); //再发布一次,验证一下是否还能够输出信息 pubsub.publish('js类的文章', "关于js的第二篇文章"); // 输出: // girlB订阅的js类的文章: 内容内容为:关于js的第二篇文章 // girlC订阅的js类的文章: 内容内容为:关于js的第二篇文章

代码可以自己运行一遍,这样比较好理解

优缺点:

优点:当我们需要维护相关对象的一致性的时候,使用观察者模式,,就可以避免对象之间的紧密耦合。例如,一个对象可以通知另外一个对象,而不需要知道这个对象的信息。

缺点:在发布/订阅模式中,如果我们需要将发布者同订阅者上解耦,将会在一些情况下,导致很难确保我们应用中的特定部分按照我们预期的那样正常工作。也就是说它的优点也可能是它的缺点

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

javascript观察者模式定义、场景实例代码详解

javascript观察者模式定义、场景实例代码详解:观察者模式定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新,也被称为是发布订阅模式。它需要一种高级的抽象策略,以便订阅者能够彼此独立地发生改变,而发行方能够接受任何有消费意向的订阅者。
推荐度:
标签: 模式 定义 js
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top