1、发布-订阅模式又叫观察者模式,它定义对象之间一种一对多的依赖关系。

2、如何实现发布-订阅模式

  2-1、首先指定好发布者

  2-2、给发布者添加一个缓冲列表,用户存放回调函数以便通知订阅者

  2-3、最后发布消息时候,发布者会遍历这个缓存列表,依次触发里面存放的订阅者回调函数

例子:

var salesOffice = {};
salesOffice.clientList = [];
salesOffice.listen = function(key,fn){
    if(!this.clientList[key]){
        this.clientList[key] = [];
    }
    this.clientList[key].push(fn);
}
salesOffice.trigger = function(){
    var key = Array.prototype.shift.call(arguments),
        fns = this.clientList[key];
    if(!fns || fns.length == 0){
        return false;
    }
    for(var i=0,fn; fn = fns[i++];){
        fn.apply(this,arguments);
    }
}

salesOffice.listen('s88',function(p){
    console.log("价格+" + p)
})

salesOffice.listen('s300',function(p){
    console.log("价格+" + p)
})

salesOffice.trigger('s88',20000);
salesOffice.trigger('s300',3000);

发布订阅的通用实现:

var event = {
    clientList : [],
    listener :function(key,fn){
        if(!this.clientList[key]){
            this.clientList[key] = [];
        }
        this.clientList[key].push(fn); //订阅消息添加进缓存列表
    },
    trigger:function(){
        var key = Array.prototype.shift.call(arguments),
            fns = this.clientList[key];
            if(!fns || fns.length === 0){
                return false;
            }
            for(var i=0,fn; fn=fns[i++];){
                fn.apply(this,arguments);
            }
    }
};

var installEvent = function(obj){
    for(var i  in event){
        obj[i] = event[i];
    }
}

通用订阅发布模式

//通用发布订阅模式
//var evt = (evt) ? evt: window.event;
var Event = (function(){
var clientList = {},
listen,
trigger,
remove;
listen = function(key,fn){
//订阅
if(!clientList[key]){
clientList[key] = [];
}
clientList[key].push(fn);
};
trigger = function(){
//发布
var key = Array.prototype.shift.call(arguments),
fns = clientList[key];
if(!fns || fns.length === 0){
return false;
}
for(var i=0,fn; fn=fns[i++];){
fn.apply(this,arguments);
}
};
/*remove = function(){
//删除 }*/
return {
listen:listen,
trigger:trigger,
remove:remove
}
})(); /* Event.listen("sales100",function(p){
console.log("总价 :"+ (p * 70));
});
Event.trigger("sales100",8000);
*/ var a = (function(){
var count = 0;
document.getElementById("btn").onclick = function(){
Event.trigger("add",count++);
}
})(); var b = (function(){
var div = document.getElementById("show");
Event.listen('add',function(p){
div.innerHTML = p;
})
})();

学习javascript设计模式之发布-订阅(观察者)模式的更多相关文章

  1. [转] JavaScript设计模式之发布-订阅模式(观察者模式)-Part1

    <JavaScript设计模式与开发实践>读书笔记. 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖它的对象都将得到通知. 例如 ...

  2. JavaScript设计模式_05_发布订阅模式

    发布-订阅模式,定义了对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都将得到通知.发布-订阅模式是使用比较广泛的一种模式,尤其是在异步编程中. /* * pre:发布-订阅 ...

  3. JavaScript设计模式(发布订阅模式)

    发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在JavaScript开发中,我们一般用事件模型来替代传统的发布—订阅模式 ...

  4. Javascript设计模式之发布-订阅模式

    简介 发布-订阅模式又叫做观察者模式,他定义了一种一对多的依赖关系,即当一个对象的状态发生改变的时候,所有依赖他的对象都会得到通知. 回忆曾经 作为一名前端开发人员,给DOM节点绑定事件可是再频繁不过 ...

  5. javaScript设计模式:发布订阅模式

    发布订阅模式的思想是在观察者模式的基础上演变而来,在观察者模式中客户端监听到对象某个行为就触发对应任务程序.而在发布订阅模式中依然基于这个核心思想,所以有时候也会将两者认为是同一种设计模式.它们的不同 ...

  6. 第五章 --- 关于Javascript 设计模式 之 发布-订阅模式

    先来个最简单的 发布订阅模式 document.body.addEventListener('click',function(){ alert(123); }); document.body.clic ...

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

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

  8. javascript中的发布订阅模式与观察者模式

    这里了解一下JavaScript中的发布订阅模式和观察者模式,观察者模式是24种基础设计模式之一. 设计模式的背景 设计模式并非是软件开发的专业术语,实际上设计模式最早诞生于建筑学. 设计模式的定义是 ...

  9. [JS设计模式]:观察者模式(即发布-订阅者模式)(4)

    简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...

随机推荐

  1. Java基础面试操作题:Java代理工厂设计模式 ProxyFactory 有一个Baby类,有Cry行为,Baby可以配一个保姆 但是作为保姆必须遵守保姆协议:能够处理Baby类Cry的行为,如喂奶、哄睡觉。

    package com.swift; public class Baby_Baomu_ProxyFactory_Test { public static void main(String[] args ...

  2. 【线性基】bzoj2322: [BeiJing2011]梦想封印

    线性基的思维题+图常见套路 Description 渐渐地,Magic Land上的人们对那座岛屿上的各种现象有了深入的了解. 为了分析一种奇特的称为梦想封印(Fantasy Seal)的特技,需要引 ...

  3. 【构造题 贪心】cf1041E. Tree Reconstruction

    比赛时候还是太慢了……要是能做快点就能上分了 Monocarp has drawn a tree (an undirected connected acyclic graph) and then ha ...

  4. Python 简单购物程序

    # Author:Eric Zhao# -*- coding:utf-8 -*-'''需求:启动程序后,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够,够就 ...

  5. UVALive - 8273 Assigning Frequencies (搜索 )

    n个点的一张图,问能否给每个点染上三种颜色中的一种,使得没有相邻的点颜色相同? n <= 35. Sample Input 4 6 6 0 3 1 5 3 2 2 5 0 4 1 0 7 12 ...

  6. vi 编辑器命令

    插入命令 a append after the cursor A append after the current line i insert before the cursor I insert b ...

  7. Java连接Access数据库的那些坑

    Java 使用 JDBC 连接Access数据库 需要掌握的技能 1.Java SE基本技术 2.懂点JDBC技术 能够学到如何使用Java正确的连接JDBC 环境 window8.1 64位 jdk ...

  8. 教你玩App怎么赚钱(一)

    在看这篇文章之前,你一定要接受一下谋哥的观点:金钱就是价值流通的手段,不要高看了钱. 玩App怎么赚钱?貌似谋哥写的文章超级多,把这个最重要的忘记了.说实在的,我为啥要写“玩App"呢?其实 ...

  9. Jquery chosen动态设置值实例介绍 select Ajax动态加载数据 设置chosen和获取他们选中的值

    for (var i = 0; i < obj.length; i++) $("#selectnum" + nid).append("<option myid ...

  10. mysql-学习链接

    http://www.cnblogs.com/lyhabc/p/3691555.html