做淘宝网站需要网站建设4038gzs

news/2025/9/23 4:43:45/文章来源:
做淘宝网站需要,网站建设4038gzs,互联网广告行业前景,唐山个人网站建设介绍 观察者模式又叫发布订阅模式#xff08;Publish/Subscribe#xff09;#xff0c;它定义了一种一对多的关系#xff0c;让多个观察者对象同时监听某一个主题对象#xff0c;这个主题对象的状态发生变化时就会通知所有的观察者对象#xff0c;使得它们能够自动更新自…介绍 观察者模式又叫发布订阅模式Publish/Subscribe它定义了一种一对多的关系让多个观察者对象同时监听某一个主题对象这个主题对象的状态发生变化时就会通知所有的观察者对象使得它们能够自动更新自己。 使用观察者模式的好处 支持简单的广播通信自动通知所有已经订阅过的对象。页面载入后目标对象很容易与观察者存在一种动态关联增加了灵活性。目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用。正文版本一 JS里对观察者模式的实现是通过回调来实现的我们来先定义一个pubsub对象其内部包含了3个方法订阅、退订、发布。 var pubsub {};(function (q) {var topics {}, // 回调函数存放的数组 subUid -1;// 发布方法 q.publish function (topic, args) {if (!topics[topic]) {return false; } setTimeout(function () {var subscribers topics[topic], len subscribers ? subscribers.length : 0;while (len--) { subscribers[len].func(topic, args); } }, 0);return true; };//订阅方法 q.subscribe function (topic, func) {if (!topics[topic]) { topics[topic] []; }var token (subUid).toString(); topics[topic].push({ token: token, func: func });return token; };//退订方法 q.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 false; };} (pubsub)); 使用方式如下 //来订阅一个pubsub.subscribe(example1, function (topics, data) { console.log(topics : data);});//发布通知pubsub.publish(example1, hello world!);pubsub.publish(example1, [test, a, b, c]);pubsub.publish(example1, [{ color: blue }, { text: hello}]); 怎么样用起来是不是很爽但是这种方式有个问题就是没办法退订订阅要退订的话必须指定退订的名称所以我们再来一个版本 //将订阅赋值给一个变量以便退订var testSubscription pubsub.subscribe(example1, function (topics, data) { console.log(topics : data);});//发布通知pubsub.publish(example1, hello world!);pubsub.publish(example1, [test, a, b, c]);pubsub.publish(example1, [{ color: blue }, { text: hello}]);//退订setTimeout(function () { pubsub.unsubscribe(testSubscription);}, 0);//再发布一次验证一下是否还能够输出信息pubsub.publish(example1, hello again! (this will fail)); 版本二 我们也可以利用原型的特性实现一个观察者模式代码如下 function Observer() {this.fns [];}Observer.prototype { subscribe: function (fn) {this.fns.push(fn); }, unsubscribe: function (fn) {this.fns this.fns.filter(function (el) {if (el ! fn) {return el; } } ); }, update: function (o, thisObj) {var scope thisObj || window;this.fns.forEach(function (el) { el.call(scope, o); } ); }};//测试var o new Observer;var f1 function (data) { console.log(Robbin: data , 赶紧干活了);};var f2 function (data) { console.log(Randall: data , 找他加点工资去);};o.subscribe(f1);o.subscribe(f2);o.update(Tom回来了)//退订f1o.unsubscribe(f1);//再来验证o.update(Tom回来了); 如果提示找不到filter或者forEach函数可能是因为你的浏览器还不够新暂时不支持新标准的函数你可以使用如下方式自己定义 if (!Array.prototype.forEach) { Array.prototype.forEach function (fn, thisObj) {var scope thisObj || window;for (var i 0, j this.length; i j; i) { fn.call(scope, this[i], i, this); } };}if (!Array.prototype.filter) { Array.prototype.filter function (fn, thisObj) {var scope thisObj || window;var a [];for (var i 0, j this.length; i j; i) {if (!fn.call(scope, this[i], i, this)) {continue; } a.push(this[i]); }return a; };} 版本三 如果想让多个对象都具有观察者发布订阅的功能我们可以定义一个通用的函数然后将该函数的功能应用到需要观察者功能的对象上代码如下 //通用代码var observer {//订阅 addSubscriber: function (callback) {this.subscribers[this.subscribers.length] callback; },//退订 removeSubscriber: function (callback) {for (var i 0; i this.subscribers.length; i) {if (this.subscribers[i] callback) {delete (this.subscribers[i]); } } },//发布 publish: function (what) {for (var i 0; i this.subscribers.length; i) {if (typeof this.subscribers[i] function) {this.subscribers[i](what); } } },// 将对象o具有观察者功能 make: function (o) { for (var i in this) { o[i] this[i]; o.subscribers []; } }}; 然后订阅2个对象blogger和user使用observer.make方法将这2个对象具有观察者功能代码如下 var blogger { recommend: function (id) {var msg dudu 推荐了的帖子: id;this.publish(msg); }};var user { vote: function (id) {var msg 有人投票了!ID id;this.publish(msg); }};observer.make(blogger);observer.make(user); 使用方法就比较简单了订阅不同的回调函数以便可以注册到不同的观察者对象里也可以同时注册到多个观察者对象里 var tom { read: function (what) { console.log(Tom看到了如下信息 what) }};var mm { show: function (what) { console.log(mm看到了如下信息 what) }};// 订阅blogger.addSubscriber(tom.read);blogger.addSubscriber(mm.show);blogger.recommend(123); //调用发布//退订blogger.removeSubscriber(mm.show);blogger.recommend(456); //调用发布//另外一个对象的订阅user.addSubscriber(mm.show);user.vote(789); //调用发布 jQuery版本 根据jQuery1.7版新增的on/off功能我们也可以定义jQuery版的观察者 (function ($) {var o $({}); $.subscribe function () { o.on.apply(o, arguments); }; $.unsubscribe function () { o.off.apply(o, arguments); }; $.publish function () { o.trigger.apply(o, arguments); };} (jQuery)); 调用方法比上面3个版本都简单 //回调函数function handle(e, a, b, c) {// e是事件对象不需要关注 console.log(a b c);};//订阅$.subscribe(/some/topic, handle);//发布$.publish(/some/topic, [a, b, c]); // 输出abc $.unsubscribe(/some/topic, handle); // 退订//订阅$.subscribe(/some/topic, function (e, a, b, c) { console.log(a b c);});$.publish(/some/topic, [a, b, c]); // 输出abc//退订退订使用的是/some/topic名称而不是回调函数哦和版本一的例子不一样$.unsubscribe(/some/topic); 可以看到他的订阅和退订使用的是字符串名称而不是回调函数名称所以即便传入的是匿名函数我们也是可以退订的。 总结 观察者的使用场合就是当一个对象的改变需要同时改变其它对象并且它不知道具体有多少对象需要改变的时候就应该考虑使用观察者模式。 总的来说观察者模式所做的工作就是在解耦让耦合的双方都依赖于抽象而不是依赖于具体。从而使得各自的变化都不会影响到另一边的变化。 参考地址 https://github.com/shichuan/javascript-patterns/blob/master/design-patterns/observer.html http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjavascript https://gist.github.com/661855 同步与推荐 本文已同步至目录索引深入理解JavaScript系列 深入理解JavaScript系列文章包括了原创翻译转载等各类型的文章如果对你有用请推荐支持一把给大叔写作的动力。转载于:https://www.cnblogs.com/TomXu/archive/2012/03/02/2355128.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue做的网站百度抓取网站建设初验申请表

CleverRaven/Cataclysm-DDA Stars: 9.0k License: NOASSERTION Cataclysm:Dark Days Ahead 是一个回合制的生存游戏,设定在一个后启示录世界中。尽管有些人将其描述为 “僵尸游戏”,但 Cataclysm 远不止于此。在这个残酷、持久、程序生成的世…

岱岳区网站设计台州网站建设惠店

https://blog.csdn.net/kxcfzyk/article/details/31728179 队列并不是很复杂的数据结构,但是非常实用,这里实现一个队列是因为在我的另一篇博客非常精简的Linux线程池实现中要用到。 队列API定义如下: //queue.h #ifndef QUEUE_H_INCLUDED…

晋中住房保障和城乡建设局网站有哪些网站建设方案

随着第四次工业革命的推进,数字化工厂解决方案已经成为制造业转型升级的必经之路。然而,在实际推进过程中,许多企业却面临着规划难以落地、投资回报率低、人才短缺等问题。如何破局,实现数字化工厂的顺利转型,成为制造…

品牌网站设计制作服务公司劳动人事争议仲裁网站建设

Python 程序在运行的时候可能需要获得当前的时间。在这个时候我们需要导入 datetime 包。获得当前时间例如,可以使用下面的代码获得当前的日期。today datetime.date.today()print("Todays date:", today)在上面的代码中,将会输出&#xff1a…

招聘网站开发手册游戏网络游戏

java中用策略模式替代if-else的大段逻辑 问题: java本来是一门以面向对象为主的语言,但很多人嘴上说着java面向对象,然后除了表映射实体之外,其他的还是面向过程的思路。 就比如今天要说的,代码中大段大段的if-else判…

佛山新网站建设如何网站设计计划

RGB转灰度函数 cvtColor(image, gray, COLOR_BGR2GRAY); 图像 目标图像 rgb转灰度 大津法二值化函数 threshold(gray, result1, 84, 255, THRESH_OTSU); 灰度图,目标图,阈值,大于阈值的转换的像素值,方法为大津法 自适应二值…

工业设计网站知乎重庆本地建站

在当今数字化时代,服务器扮演着重要的角色,为企业、组织和个人提供各种网络服务。然而,服务器也成为了网络攻击者的目标之一,可能面临各种安全威胁,例如DDoS攻击、恶意软件攻击、数据泄露等。为了有效地防范服务器被攻…

阿里去要企业网站建设方案书如何看网站是用什么语言做的

一、部署Mysql 需求: 在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQLServer。 二、部署tomcat 三、部署nginx 四、部署redis

网站建设 凡科如何做的网站手机可以用

文章目录 1.设计来源1.1 书本正面1.2 界面1-21.3 界面3-41.4 界面5-61.5 界面7-81.6 界面9-101.7 界面11-121.8 书本结尾 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/1…

国际域名注册证书企业网站优化设计应该把什么放在首位

RBD 方式的 工作 流程: 1、客户端创建一个pool,并指定pg数量,创建 rbd 设备并map 到文件系统; 2、用户写入数据,ceph进行对数据切块,每个块的大小默认为 4M,每个 块名字是 object序号&#xff…

怎么建立一个网站放图片国内网站设计案例欣赏

INI 配置之前章节我们已经接触过一些 INI 配置规则了,如果大家使用过如 Spring 之类的 IoC/DI 容器的话,Shiro 提供的 INI 配置也是非常类似的,即可以理解为是一个 IoC/DI 容器,但是区别在于它从一个根对象 securityManager 开始。…

松江品划企业网站建设h5制作软件教程

系列简介:这个系列文章讲解线性代数的基础内容,注重学习方法的培养。线性代数课程的一个重要特点(也是难点)是概念众多,而且各概念间有着千丝万缕的联系,对于初学者不易理解的问题我们会不惜笔墨加以解释。在内容上,以…

驾校网站建设费用怎么自己做网站

2019独角兽企业重金招聘Python工程师标准>>> Lori Macvittie 微服务架构是把双刃剑,我们享受它带来的开发速度(development velocity),却也不得不面对服务间通讯带来的复杂性问题。 目前大多数扩展容器化微服务的架构多…

网站速度诊断中国北京出啥大事了

1. 进程与线程有那些区别和联系?   每个进程至少需要一个线程。 进程由两部分构成:进程内核对象,地址空间。线程也由两部分组成:线程内核对象,操作系统用它来对线程实施管理。线程堆栈,用于维…

网站页面设计论文长沙做网站最好的公司

摘要:CSS 过渡效果是一种常见的美观技术,用于在元素状态变化时平滑地过渡。本文将详细介绍 CSS 过渡效果的语法、属性、使用场景以及实现动画效果的步骤。 一、CSS 过渡效果概述 CSS 过渡效果是一种改变元素属性的视觉效果,使得从一个状态到另…

简述网站设计基本流程外贸建站 台州

关于自定义循环队列的实现原理和要点可以参见之前的博文系列:循环队列及C语言实现。这里主要对JAVA下的具体实现方式与原理进行说明。 一、JAVA 中已经自带了 Queue、DQueue、ArrayList、LinkedList 等常用的数据结构,为什么还要单独实现循环队列&#…

淄博 网站设计小鸟云WordPress数据库连接

背景:用nohup运行jar包时候,会产生大量的日志文件,影响磁盘存储,生产环境大概1天有30个g 解决方案: 1、用split分割日志,代码在下面(可以先测试一下),然后加入到定时任务…

常德自助建站seo哈尔滨怎样快速建站

现象: 在CodeFirst时,先写字段与表,创建数据库后,再添加内容 但字段与表会变更,比如改名删除增加等 需求: 当表字段变更时,同时变更数据库,执行数据库迁移 核心命令 Add-Migrat…

什么是 网站收录广州申请公司注册网站

738.单调递增的数字 思路:要求一个数字从第一位往后的大小是单调递增的,先把数字转换成字符串,然后从后往前逐位遍历,如果当前位比前一位小,则前一位--,从当前位往后都应该为9,因此记下当前位置…

html做的网页怎么变成网站手机商城网站建设策划方案范文

汇编概述 汇编需要学习的大致框架如下: 汇编中的符号 1.指令;能够北嘁肷梢惶?2bit机器码,并且能够被cpui识别和执行 2.伪指令:本身不是指令,编译器可以将其替换成若干条指令 3.伪操作:不会生成指令…