观察者模式,即发布与订阅模式,实现一对多的一种关系模式,当一种对象接受信号时其他所有依赖均有行为。我们在写code的时候总是会去自定义一些事件,这就是观察者常常使用的地方:

  • JS中的观察者模式应用:

    var
      dom = document.getElementById('demo');
    dom.addEventListener('click',function(){
      console.log('demo is running.');
    });

    利用addEventListener添加一个click事件,然后点击Dom元素的时候触发这个click事件执行回调函数。

  • Jquery中的观察者模式应用:
    var
      dom = $('#demo');
    dom.on('emit', function(){
      console.log('demo is running');
    });
    dom.trigger('emit');

    利用jquery中on来注册个事件,当trigger触发的时候执行回调函数。

  • nodejs中观察者模式应用:
    var
    EventEmitter = require('events').EventEmitter,
    event = new EventEmitter();
    event.on('demo', function() {
    console.log('demo is running');
    });
    setTimeout(function() {
    event.emit('demo');
    }, 1000);

    原理都是一个,定义事件与回调函数,然后触发事件执行回调函数。

  • 观察者模式的具体实现(个人理解):
    var
    event = {
    on: function (eventname, callback) {
    if (!this.handler) {
    this.handler = {};
    }
    if (!this.handler[eventname]) {
    this.handler[eventname] = [];
    }
    this.handler[eventname].push(callback);
    },
    emit: function (eventName) {
    var
    handlers = this.handler[eventName];
    for (var i in handlers) {
    if (handlers.hasOwnProperty(i)) {
    handlers[i]();
    }
    }
    }
    }
    event.on('demo', function () { console.log('demo is running') });
    $('#demo').click(function () {
    event.emit('demo');
    })

    其实原理很简单,我们的目标是什么?当然是调用函数,但是怎么调呢~多个函数怎么一起调用呢?我们可以将所有函数放在一个数组里,然后调用循环这个数据调用数据内的每一项不就达到目的了吗,这就是观察者的实现方式,数组名就是注册的事件名,数组中的每一项就是事件对应的回调函数喽~是不是so easy。

最新文章

  1. SQL Server 2012 Managed Service Account
  2. Python爬虫代理池
  3. Asp.net中导出Excel文档(Gridview)
  4. Mybatis学习记录
  5. Linux Oracle删除归档日志
  6. sed 命令及shell的if语句的运用实例
  7. iOS开发-VFL(Visual format language)和Autolayout
  8. JDBC学习笔记(一)
  9. python super研究
  10. pycharm中添加扩展工具pylint
  11. crawler_浅谈网络爬虫
  12. 安装aptana(1)
  13. adb pull 文件夹到电脑
  14. MVC4 下DropDownList使用方法(转)
  15. mysql中显示当前数据库下的所有表,包括视图。
  16. Asp.net Vnext 模块化实现
  17. SoundPool 音频播放 API 详解【示例】
  18. C++ 11 std::function std::bind使用
  19. SSH&SFTP服务分离+家目录锁定
  20. Java程序设计10——与运行环境交互

热门文章

  1. SharePoint 2010 加入项目到用户/欢迎菜单
  2. [置顶] NB多项式事件模型、神经网络、SVM之函数/几何间隔——斯坦福ML公开课笔记6
  3. ASP.NET页面生命周期和asp.net应用程序生命周期
  4. iOS后向兼容:如何发现过期接口
  5. Jeffrey Richter's Power Threading Library
  6. win32多线程-异步过程调用(asynchronous Procedure Calls, APCs)
  7. C/C++基础知识总结——数组、指针域、字符串
  8. [转]Inside Swift
  9. Struts2.1.8 + Spring3.0+ Hibernate3.2整合笔记
  10. javascript中的promise和deferred:实践(二)