• JS 设计模式八 -- 发布订阅者模式


    概念

    发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多(一个发布,多个观察)的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知。

    优点

    1、支持简单的广播通信,当对象状态发生改变时,会自动通知已经订阅过的对象。

    2、发布者与订阅者耦合性降低

    缺点

    创建订阅者需要消耗一定的时间和内存。

    如果过度使用的话,反而使代码不好理解及代码不好维护。

    代码实现

    var Event = (function(){
        var list = {}, // 缓存订阅者列表
              listen,   // 订阅
              trigger,  // 发布订阅
              remove;   // 移除订阅
              listen = function(key,fn){
                if(!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("color",function(size) {
        console.log("尺码为:"+size); // 打印出尺码为42
    });

    // 发布 Event.trigger(
    "color",42);
  • 相关阅读:
    【2020省选模拟】01.18比赛总结
    【2020省选模拟】01.17比赛总结
    利用dockerfile 安装一个tomcat7
    docker的基本安装和命令详解
    jumpserver1.4.1 安装过程
    Redis info参数总结
    ansible-service
    ansible-yum
    centos源码安装mariadb和Galera 多主集群
    ansible常用模块
  • 原文地址:https://www.cnblogs.com/gaosirs/p/10756039.html
Copyright © 2020-2023  润新知