观察者模式 -> dom事件 / 自定义事件 / Promise 我的理解

观察者模式(Observer)

又称作为发布-订阅模式或消息机制,定义了一种依赖关系,解决了主体对象与观察者对象之间通讯和耦合的问题;

观察者模式例子 引用于<JavaScript设计模式>

var Observer = (function(){

    var _messages = {}; // 监听信息容器
    return {
        /**
         * 注册监听信息接口
         * @param {String} type 监听信息类型
         * @param {Function} fn  对应的回调函数
         */
        regist: function(type, fn){
            // 如果过目前没有该类信息 创建数组添加  如果已经存在该类信息通过push数组添加避免覆盖
            if(typeof _messages[type] === ‘undefined‘){
                _messages[type] = [fn];
            }else{
                _messages[type].push(fn);
            }
        },
        /**
         * 发布信息接口
         * @param {String} type 发布相关信息,触发所有该信息的回调函数
         * @param {Object} args 传给回调函数的信息参数
         */
        fire: function(type, args){
            // 如果该类信息没有注册信息则,直接返回
            if(!_messages[type]) return;
            // 通过args参数定义 响应事件的事件对象
            var event = {
                type: type,
                args: args || {},
            },
            i = 0,
            len = _messages[type].length;
            for(;i < len; i++){
                // 传入参数调用 回调函数
                _messages[type][i].call(this,event);
            }
        },
        /**
         * 移除监听信息
         * @param {String} type
         * @param {Function} fn
         */
        remove: function(type,fn){
            if(_messages[type] instanceof Array){
                var i = _messages[type].length-1;
                for(;i>=0;i--){
                    // 遍历该类型的函数 找出对应的 函数并删除
                    _messages[type][i] === fn && _messages[type].splice(i,1);
                }
            }
        },
    };
})();

// 观察者->主题:今天中午吃什么菜呢,中午开饭的时候告诉我
function getFoodMenu(obj){
    console.log(‘今天的吃的是:‘+obj.args.foodMenu)
}
Observer.regist(‘lunch‘,getFoodMenu );

// 主题->观察者: 开饭了 ,今天只有番茄鸡蛋/豆腐汤 呵呵~~
Observer.fire(‘lunch‘,{
    foodMenu: ‘番茄鸡蛋,豆腐汤‘,
}); // 调用getFoodMenu ==打印==> 今天的吃的是:番茄鸡蛋,豆腐汤

从用法上简单的总结就是,添加回调函数和触发回调函数

DOM事件也是同样的原理

注册监听: addEventListener(type,fn)注册事件

取消监听: removeEventListener(type,fn)

当主体发布消息时传入Event事件对象z执行回调函数

DOM事件和自定义事件 区别:自动发布信息 , 手动发布信息

DOM事件类型是固定的 click / mmouseover / keydown ....

当DOM受到相关操作的时候DOM节点自动发布信息 ,触发回调函数

而自定义事件,而自定义事件需要创建事件对象,再去手动的发布信息触发回调函数

Promise也有类似的原理

原文地址:https://www.cnblogs.com/liang1100/p/8280586.html

时间: 2025-01-13 18:07:03

观察者模式 -> dom事件 / 自定义事件 / Promise 我的理解的相关文章

Java的事件自定义事件学习

课程设计要做一个游戏,由于对C++不是很熟悉,老师也准许使用java 或者其他的语言,在.net我学过事件,一种委托回调,但是在java 我不是很了解,应该原理都相同吧! 游戏大致是这样的,现在这在写成功判断!于是我自己加了一个事件\ package com.zhaojun.base; import org.w3c.dom.events.Event; import java.util.*; /** * 游戏类 * * @author Coder-Jun */ public class Game

ExtJS要利用观察者模式 去实现自定义的事件

1 // 要利用观察者模式 去实现自定义的事件 2 3 4 //1:由于浏览器他自己能定义内置的事件(click/blur...) 5 // 我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事件) 6 var Observable = function(){ 7 //承装自己所定义的事件类型的 8 this.events = ['start','stop']; 9 //我们应该设计一种数据类型,这种数据类型就可以去维护自定义事件类型 和 和相关绑定函数的关系,结构如下

javascript和jquey的自定义事件小结

“通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.” 可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好 对象之间通过直接方法调用来交互 1)对象A直接调用对象B的某个方法,实现交互:直接方法调用本质上也是属于一种特殊的发送与接受消息,它把发送消息和接收消息合并为一个动作完成: 方法调用方和被调用方被紧密耦合在一起:因为发送消息和接收消息是在一个动作内完成,所以无法做到消息的异步发送和接收: 2)对象A生成消息->将消息通知给一个事件消息处理器(Obs

js原生创建模拟事件和自定义事件的方法

让我万万没想到的是,原来<JavaScript高级程序设计(第3版)>里面提到的方法已经是过时的了.后来我查看了MDN,才找到了最新的方法. 1. 模拟鼠标事件 MDN上已经说得很清楚,尽管为了保持向后兼容MouseEvent.initMouseEvent()仍然可用,但是呢,我们应该使用MouseEvent().我们使用如下页面做测试 1 <!DOCTYPE html> 2 <html> 3 <head lang="zh-CN"> 4

[转] 自定义事件

DebugLZQ 原文.NET自定义事件小结 关于事件各位应该都不陌生,相信每个程序员都可以拍着胸脯说“事件?我知道啊~”,可如何自定义事件?也许有人心中就不是那么底气十足了. 用很多地方都被引用到泛滥的一个例子来写吧,始作俑者就不去深究了.描述是这样的:小偷进入时,事件发送者(狗)发送狗叫事件(自定义),(事件接收者)主人订阅狗叫事件并处理(抓住小偷),事件的参数传递的是小偷的数量.下面就给出实现的具体步骤---已经在代码注释中标明,以供各位博友抽象出自定义事件的流程. using Syste

【教程】【FLEX】#003 自定义事件、模块间通讯

本篇笔记,主要阐明 事件是如何创建 和 如何使用自定义事件达到模块之间通讯 的效果. 句子解释: 什么叫做模块之间的通讯呢?? 简单点说,就是两个模块之间可以互相传数据. A模块 可以接收到 B模块的数据,这个就叫做通讯. 所以A模块注册了一个事件, B模块触发了这个事件,A接收到. 那么 这个就是A.B模块进行通讯了. 一.自定义事件的创建(代码例子在文章底部) 1.创建一个ActionScript类,继承Event 2.声明属性 2.1  保存数据的属性(事件保存数据的对象,可多个) 2.2

观察者模式(2)--自定义事件

[附加题] 请实现下面的自定义事件 Event 对象的接口,功能见注释(测试1) 该 Event 对象的接口需要能被其他对象拓展复用(测试2) // 测试1 Event.on('test', function (result) { console.log(result); }); Event.on('test', function () { console.log('test'); }); Event.emit('test', 'hello world'); // 输出 'hello world

漫谈js自定义事件、DOM/伪DOM自定义事件

一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木有?则RSS或盗版)然后撤了. 事件是个大课题,真要从断奶开始讲起的话,可以写个12期的连载.关于JS事件的文章(类似DOM/BOM事件模型,IE与其他浏览器事件差异,DOM1/DOM2事件定义等)落叶般随处可见.熟豆子反复炒一点意思都没有,因此,这里谈谈自己感兴趣的自定义事件以及周边. 所谓自定义

js自定义事件、DOM/伪DOM自定义事件

一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木有?则RSS或盗版)然后撤了. 事件是个大课题,真要从断奶开始讲起的话,可以写个12期的连载.关于JS事件的文章(类似DOM/BOM事件模型,IE与其他浏览器事件差异,DOM1/DOM2事件定义等)落叶般随处可见.熟豆子反复炒一点意思都没有,因此,这里谈谈自己感兴趣的自定义事件以及周边. 所谓自定义