当前位置: 首页 > 编程日记 > 正文

JS设计模式-观察者模式

观察者(又称发布订阅)模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

原文链接

应用场景

当用户在网页执行一些操作(如点击)后就需要执行一些预定的事件(如表单提交、跳转页面)

  • 优点:在发布者和订阅者间耦合性降低
  • 缺点:弱化了对象间的关系,不利于代码的维护和理解

实现思路

  • 确定发布者
  • 定义发布者缓存列表,存储回调函数通知订阅者
  • 发布消息依次执行缓存列表回调函数

简单实现

let event = {};
event.list = [];
//增加订阅者
event.listen = function(fn){event.list.push(fn);
}
//发布消息
event.trigger = function(){for(var i = 0,fn; fn = this.list[i++];) {fn.apply(this,arguments); }
}let click = function(){console.log('event:click');
}let hover = function(){console.log('event:hover');
}event.listen(click);
event.listen(hover);
event.trigger();
//打印:
‘event:click’
'event:hover'

完善观察者模式

let Event = (function(){var list = {},listen,trigger,remove;listen = function(key,fn){list[key] = list[key]||[];list[key].push(fn);};trigger = function(){var key = Array.prototype.shift.call(arguments),fns = list[key];if(!fns || fns.length === 0) {return false;}for(var i = 0, fn; fn = fns[i++];) {fn.apply(this,arguments);}};remove = function(key,fn){var fns = list[key];if(!fns) {return false;}if(!fn) {fns && (fns.length = 0);}else {for(var i = fns.length - 1; i >= 0; i--){var _fn = fns[i];if(_fn === fn) {fns.splice(i,1);}}}};return {listen: listen,trigger: trigger,remove: remove}
})();Event.listen('click', function(type) {console.log('event: ' + type +' click'); 
});Event.trigger('click' , 'button');
//打印
'event: button click'

观察者模式可以用于模块间通讯,订阅用户的事件、状态,触发执行相应的逻辑处理。

相关文章:

如何理解JS的单线程?

JS本质是单线程的。也就是说,它并不能像JAVA语言那样,两个线程并发执行。 但我们平时看到的JS,分明是可以同时运作很多任务的,这又是怎么回事呢? 首先,JS的代码,大致分为两类,同步代码和异步代…

Fedora 14下安装使用rarlinux

安装Fedora 14后,其默认情况下不能解压RAR文档,因为系统自带的解压软件不支持RAR格式文档,但由于经常要用到RAR文档,因此就必须安装一个RAR软件。Linux版的RAR下载链接: http://www.rarlab.com/download.htm 以rarlinu…

技术图文:如何利用 Python 做一个简单的定时器类?

背景 今天在B站上看有关 Python 最火的一个教学视频,零基础入门学习 Python,这也是我们 Python基础刻意练习活动 的推荐视频教程。 在学习魔法方法的时候,有一节视频是制作一个简单的定时器,基本要求如下: 定制一个计…

20、C#里面方法的创建和显示

在C#里面,和Java也是一样的,都是可以创建方法的。这里所说的方法,就是其它编程语言里面的函数、子程序、过程等。创建的方法有两种:一种是没有返回值的方法。一种是有返回值的方法。无论是哪种方法,其实都是很简单的。…

优秀的Java程序员应具备哪些编程技术?

想要成为一名合格的java程序猿,需要学习的知识是有很多的,但是基础知识一定要非常牢固,基础不牢固的程序员,随时都会被新的知识和技术所淘汰,下盘不稳风一吹就倒,那么具体作为一个优秀的Java程序员应具备哪…

asp.net 后台事件掉用前台js

在下面的例子中&#xff0c;我们在一个 .aspx 文件中声明了一个 TextBox 控件和一个 Label 控件。当您更改了 TextBox 中的值&#xff0c;并且在 TextBox 外单击时&#xff0c;change 子例程就会被执行。change 子例程会向 Label 控件写一条文本&#xff1a; <script runat&…

Android -- 利用Broadcast开启Service

Broadcast和Service都是Android四大组建之一的。 这里的广播是动态的&#xff0c;自己注册的一个广播。 这种最典型的用法就是利用开机广播&#xff0c;然后再起自己的服务&#xff0c;也就是在Android手机中做到开启启动。 Service与Broadcast …

资料分享:推荐一本《李宏毅机器学习》开源电子书!

背景 今天在 github 上看到了 datawhale 发布的 李宏毅机器学习笔记。 https://datawhalechina.github.io/leeml-notes 其目录如下&#xff1a; P1 机器学习介绍P2 为什么要学习机器学习P3 回归P4 回归-演示P5 误差从哪来&#xff1f;P6 梯度下降P7 梯度下降&#xff08;用…

Python 中常见的配置文件写法

相信学习Python或者正在进行Python工作的小伙伴都会有一个疑问&#xff0c;为什么要写配置文件呢?在开发过程中&#xff0c;我们常常会用到一些固定参数或者是常量。对于这些较为固定且常用到的部分&#xff0c;往往会将其写到一个固定文件中&#xff0c;避免在不同的模块代码…

技术图文:Python描述符 (descriptor) 详解

背景 今天在B站上学习“零基础入门学习Python”这门课程的第46讲“魔法方法&#xff1a;描述符”&#xff0c;这也是我们组织的 Python基础刻意练习活动 的学习任务&#xff0c;其中有这样的一个题目。 练习要求&#xff1a; 先定义一个温度类&#xff0c;然后定义两个描述符…

[转]自定义hadoop map/reduce输入文件切割InputFormat

本文转载自&#xff1a;http://hi.baidu.com/lzpsky/blog/item/99d58738b08a68e7b311c70d.html   hadoop会对原始输入文件进行文件切割&#xff0c;然后把每个split传入mapper程序中进行处理&#xff0c;FileInputFormat是所有以文件作 为数据源的InputFormat实现的基类&…

使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型...

from:http://www.freebuf.com/articles/network/139697.html DGA&#xff08;域名生成算法&#xff09;是一种利用随机字符来生成C&C域名&#xff0c;从而逃避域名黑名单检测的技术手段。例如&#xff0c;一个由Cryptolocker创建的DGA生成域xeogrhxquuubt.com&#xff0c;如…

学习Python开发培训有用吗

学习Python开发培训有用吗?这是目前很多人都比较关注的一个问题&#xff0c;Python语言在最近几年是广受IT互联网行业关注的&#xff0c; 下面我们就针对这问题来详细的分析一下。 学习Python开发培训有用吗?Python是被广泛使用的高级编程语言&#xff0c;Python解释器本身几…

Web性能优化实践——应用层性能优化

随着公司项目的进一步推广&#xff0c;用户数量的增加&#xff0c;已经面临着单台服务器不能负载的问题。 这次的优化由于时间关系主要分两步走&#xff0c;首先优化应用层代码以提高单台服务器的负载和吞吐率。之后再进行分表&#xff0c;引入队列、MemCached等分布式应用。 项…

技术图文:Python魔法方法之属性访问详解

背景 今天在B站学习“零基础入门学习 Python”中的第45节“魔法方法&#xff1a;属性访问”&#xff0c;这也是我们组织的 Python基础刻意练习活动 的学习任务&#xff0c;其中有这样的一个题目。 练习要求&#xff1a; 写一个矩形类&#xff0c;默认有宽和高两个属性。如果…

chmod权限设置

drwxr-xr-x. 7 root root 4096 Sep 26 20:16 sysconfig-rw-r--r--. 1 root root 1150 Aug 31 18:46 sysctl.conflrwxrwxrwx. 1 root root 14 Aug 31 17:21 system-release -> centos-release例如&#xff1a;-rw-r--r--第一个代表文件类型:-普通文件&#xff1a;…

【Python培训基础】一篇文件教你py文件打包成exe

场景: 如果要将我们编写好的代码给别人使用,如果要他们直接使用我们的代码,就需要安装各种编译软件以及第三方模块,还要对软件操作,编程有一定的了解,这对使用者的要求比较高,不是很方便,为了解决这一问题,我们可以选择将我们编写的代码,编译成一个可执行文件,这样,就可以实现跨…

刻意练习:Python基础 -- Task06. 字典与集合

背景 我们准备利用17天时间&#xff0c;将 “Python基础的刻意练习” 分为如下任务&#xff1a; Task01&#xff1a;变量、运算符与数据类型&#xff08;1day&#xff09;Task02&#xff1a;条件与循环&#xff08;1day&#xff09;Task03&#xff1a;列表与元组&#xff08;…

WCF - Session 剖析

WCF中的Session WCF是MS基于SOA建立的一套在分布式环境中各个相对独立系统进行通信的构架&#xff0c;实现了最新的基于WS-*规范。按照SOA的原则&#xff0c;相对独自的业务逻辑以service的形式封装&#xff0c;调用者通过Messaging的方式调用Service。对于承载着某个业务功能的…

mui 微信支付 与springMVC服务器交互

昨天搞定了微信支付,没有想象中的难,主要是官方的demo不全好多东西要自己琢磨,mui端的就不写了支付宝的有了一模一样.上java端的首先是jar包 一个是用来解析xml文件 一个是用来解析json 当然可以替代 然后是工具类当然并不是全都用的到. public class ConfigUtil { /** * 服务…

Python零基础自学会有哪些弊端

Python在人工智能领域的发展前景非常好&#xff0c;很多人都想要学习Python技术&#xff0c;有一些小伙伴会选择通过自学来学习&#xff0c;但是如果是零基础&#xff0c;自学的话一定要注意这些弊端&#xff0c;下面就为大家详细的介绍一下Python零基础自学会有哪些弊端? Pyt…

技术图文:如何利用 Turtle 绘制一棵漂亮的樱花树

背景 最近看到很多机构在推动“青少年编程能力等级标准”的制定以及相关考试的测评&#xff0c;看样子今年年底这个事情就能够确定&#xff0c;明天上半年在一些大中城市就会全面铺开。 《青少年编程能力等级》标准发布&#xff0c;年底前将在部分地区落地青少年编程能力等级…

Python 是否是下一个 PHP?为什么?

前几天和一个看好 Python 的 Rails 开发者聊天&#xff0c;他看好 Python 的原因就是 PHP 统治今天的网络应用开发。而 Python 很像下一个 PHP 。 『下一个 PHP』如何定义&#xff1f;是指流行程度么&#xff1f;如果是的话&#xff0c;我觉得 Python 不会像 PHP 那样流行。根本…

正确使用STL-MAP中Erase函数

一切尽在代码中。 #include <iostream> #include <map> #include <string> using namespace std ;int main(void) { map<int, string> m ;m.insert(pair<int, string>(1, "abc")) ;m.insert(pair<int, string>(2, "def&qu…

学完UI设计可以从事哪些工作

最近有很多同学都会问到一个问题&#xff0c;就是学完UI设计可以从事哪些工作?对于正在学习UI设计的同学和已经学完UI设计的同学们&#xff0c;可以来看看下面文章的详细介绍就知道了。 学完UI设计可以从事哪些工作? 一、交互设计师。 学习UI设计之后就可以做交互设计师了&am…

刻意练习:Python基础 -- Task08. 异常处理

背景 我们准备利用17天时间&#xff0c;将 “Python基础的刻意练习” 分为如下任务&#xff1a; Task01&#xff1a;变量、运算符与数据类型&#xff08;1day&#xff09;Task02&#xff1a;条件与循环&#xff08;1day&#xff09;Task03&#xff1a;列表与元组&#xff08;…

Winform 控件自适应 JSP 入门登录案例

明儿在放&#xff0c;先睡转载于:https://www.cnblogs.com/javabin/archive/2011/09/26/2192402.html

MyEclipse对Struts2配置文件较检异常 Invalid result location value/parameter

有时在编写struts.xml时会报错&#xff0c;但是找不出有什么她方有问题。也能正常运行 MyEclipse有地方去struts的xml进行了验证&#xff0c;经查找把这里 的build去掉就可以了 本文转自lpxxn博客园博客&#xff0c;原文链接&#xff1a;http://www.cnblogs.com/li-peng/p/3791…

学Python有哪些优势

Python在人工智能领域应用是比较广泛的&#xff0c;近几年&#xff0c;越来越多的人对Python技术比较感兴趣&#xff0c;想要学习&#xff0c;那么具体学Python有哪些优势呢?我们来看看下面的详细介绍就知道了。 学Python有哪些优势? 1.Python很受欢迎 流行程度似乎不是衡量价…

MongoDB 正则表达式

阅读目录 示例不区分大小写数组使用正则表达式正则中包含变量回到顶部示例 MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式。 > db.col.find() { "_id" : ObjectId("56c6bbef64799370c0ef358a"), "x" : "hello world", &…