javascript 设计模式 -- 发布/订阅模式

直接上代码:

index.html :

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>设计模式</title>
</head>
<body>
	<div id="box">
		<div>{{message}}</div>
	</div>
	<!--
	// 全局:
	// 低耦合,高内聚
	// 继承:JS并没有继承这个概念(伪继承),ajax没有跨域这个概念一样
	// 类式继承、原型式继承
	// 代码重用高:方法解耦合高(独立性)、方法尽量独立和组合都能够使用
	-->
	<script src="vue.js"></script>
	<script>
		/*// 类式继承
		var father = function() { // 爸爸干爸爸的活
			this.age = 50;
			this.say = function(){
				console.log(11);
			}
		}

		var child = function(){ // 儿子干儿子的活
			this.name = "think";
			father.call(this); // call apply
		}

		var man = new child();
		man.say();*/

		// 原型式继承
		var father = function(){
			//
		}

		father.prototype.a = function(){
			console.log(2);
		}

		var child = function(){
			//
		}

		// 子继承父属性
		child.prototype = new father();
		var man = new child();
		man.a();

		// jquery中所有方法都是可以连缀的 $(".box").html().css({"background":"yellow"})
		// new对象不能直接使用 局部对象所有对象外部都无法访问 window.jQuery = window.$ = jQuery
		// 调用之后才 new

		new Vue({ //
			el:"#box", // 元素
			data:{
				message:"hello",
				arr:[1,2,3],
				num:0
			},
			created: function(){ // vue构造函数
				var _this = this;
				setInterval(function(){ // 不屑分析
					_this.arr.push("DN"+(_this.num+1));
					// 操作内部数据时,不会整个渲染更新(DIFF算法:区分我们哪个地方有区别)
					_this.num += 1; // 动态数据追踪,订阅者模式

					// 值:更新的时候,元素是存在的,无需创建元素(document.createElement)
					// 数组增加:更新的时候,元素不存在,需要创建(document)
				},5000);
			}
		})

		//订阅者模式
		// 每次都会输出所有的信息
		/*var shoeObj = {};
		shoeObj.list = []; // 存放订阅者

		shoeObj.listen = function(fn){ // 订阅一次,增加数据一次
			shoeObj.list.push(fn); //订阅消息添加到缓存列表
		}
		// 效果性的开发,只是基础
		shoeObj.trigger = function(){ // 发布消息
			for(var i=0,fn;fn = this.list[i++];){
				fn.apply(this,arguments); // arguments
			}
		}

		// 订阅
		shoeObj.listen(function(color,size){
			console.log(color);
			console.log(size);
		});

		shoeObj.listen(function(color,size){
			console.log("2" + color);
			console.log("2" + size);
		});

		shoeObj.trigger("红色",20);
		shoeObj.trigger("黄色",20);*/

		// 修改后
		/*var shoeObj = {};
		shoeObj.list = []; // 存放订阅者

		shoeObj.listen = function(key,fn){ // 订阅增加一个名字,方便区分订阅者信息
			if(!this.list[key]){
				shoeObj.list[key] = []; //订阅消息添加到缓存列表
			}
			this.list[key].push(fn);
		}
		// 效果性的开发,只是基础
		shoeObj.trigger = function(){ //根据订阅者名字发布消息
			var key = Array.prototype.shift.call(arguments); //
			// arguments: 参数,取出消息类型的名称
			var fns = this.list[key];

			// 如果没有订阅过该消息,则返回
			if(!fns || fns.length === 0){
				return;
			}

			for(var i=0,fn;fn = fns[i++];){
				fn.apply(this,arguments);
			}
		}

		// 订阅
		shoeObj.listen("red",function(size){
			console.log(size);
		});

		shoeObj.listen("yellow",function(size){ // yellow改为动态参数,vuejs的动态更新出来一半
			console.log("2" + size);
		});

		shoeObj.trigger("red",40);
		shoeObj.trigger("yellow",40);*/

		// 封装
		var event = {
			list:[], // 订阅的人数是不固定的
			listen:function(key,fn){
				if(!this.list[key]){
					this.list[key] = [];// 清空
				}
			}
		}

		var shoeObj = {};
		shoeObj.list = []; // 存放订阅者

		shoeObj.listen = function(key,fn){ // 订阅增加一个名字,方便区分订阅者信息
			if(!this.list[key]){
				shoeObj.list[key] = []; //订阅消息添加到缓存列表
			}
			this.list[key].push(fn);
		}
		// 效果性的开发,只是基础
		shoeObj.trigger = function(){ //根据订阅者名字发布消息
			var key = Array.prototype.shift.call(arguments); //
			// arguments: 参数,取出消息类型的名称
			var fns = this.list[key];

			// 如果没有订阅过该消息,则返回
			if(!fns || fns.length === 0){
				return;
			}

			for(var i=0,fn;fn = fns[i++];){
				fn.apply(this,arguments);
			}
		}

		// 订阅
		shoeObj.listen("red",function(size){
			console.log(size);
		});

		shoeObj.listen("yellow",function(size){ // yellow改为动态参数,vuejs的动态更新出来一半
			console.log("2" + size);
		});

		shoeObj.trigger("red",40);
		shoeObj.trigger("yellow",40);

		var initEvent = function(){ // 让所有普通对象都具有发布订阅功能
			for(var i in event){ // 对象可以是多个
				obj[i] = event[i];
			}
		}

		var shoeObj = {};
		initEvent(shoeObj);

		shoeObj.listen("red",function(size){
			console.log(size);
		})

		shoeObj.trigger("red",40);

		// 取消订阅
		event.remove = function(key,fn){
			var fns = this.list[key];
			if(!fns){
				return false;
			}
			if(!fn){
				fn && (fns.length = 0);
			}else{
				for(var i = fns.length-1;i>=0;i--){
					//
				}
			}
		}

		// RN
	</script>
</body>
</html>

.

时间: 2024-10-01 02:15:46

javascript 设计模式 -- 发布/订阅模式的相关文章

设计模式-发布订阅模式(javaScript)

1. 前言 2. 什么是发布订阅模式 3. 发布订阅优缺点 4. 举例 4. 总结 1. 前言 发布订阅者模式是为了发布者和订阅者之间避免产生依赖关系,发布订阅者之间的订阅关系由一个中介列表来维护.发布者只需做好发布功能,至于订阅者是谁,订阅者做了什么事情,发布者是无需关心的 2. 什么是发布订阅模式 发布订阅:是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者).而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在.同样的,订阅者可以表达

[转] 浅析JavaScript设计模式——发布-订阅/观察者模式

前一段时间一直在写CSS3的文章 一直都没写设计模式 今天来写写大名鼎鼎观察者模式 先画张图 观察者模式的理解 我觉得还是发布-订阅模式的叫法更容易我们理解 (不过也有的书上认为它们是两种模式……) 这就类似我们在微信平台订阅了公众号 当它有新的文章发表后,就会推送给我们所有订阅的人 我们可以看到例子中这种模式的优点 我们作为订阅者不必每次都去查看这个公众号有没有新文章发布, 公众号作为发布者会在合适时间通知我们 我们与公众号之间不再强耦合在一起.公众号不关心谁订阅了它, 不管你是男是女还是宠物

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

简介 发布-订阅模式又叫做观察者模式,他定义了一种一对多的依赖关系,即当一个对象的状态发生改变的时候,所有依赖他的对象都会得到通知. 回忆曾经 作为一名前端开发人员,给DOM节点绑定事件可是再频繁不过的事情.比如如下代码 document.body.addEventListener('click',function () { alert(2333); },false); document.body.click();//模拟点击事件 这里我们订阅了document.body的click事件,当bo

理解《JavaScript设计模式与开发应用》发布-订阅模式的最终版代码

最近拜读了曾探所著的<JavaScript设计模式与开发应用>一书,在读到发布-订阅模式一章时,作者不仅给出了基本模式的通用版本的发布-订阅模式的代码,最后还做出了扩展,给该模式增加了离线空间功能和命名空间功能,以达到先发布再订阅的功能和防止名称冲突的效果.但是令人感到遗憾的是最终代码并没有给出足够的注释.这让像我一样的小白就感到非常的困惑,于是我将这份最终代码仔细研究了一下,并给出了自己的一些理解,鉴于能力有限,文中观点可能并不完全正确,望看到的大大们不吝赐教,谢谢! 下面是添加了个人注释的

JavaScript设计模式与开发实践---读书笔记(8) 发布-订阅模式

发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于异步编程中,这是一种替代传递回调函数的方案. 可以取代对象之间硬编码的通知机制,一个对象不用再显式地调用另外一个对象的某个接口. 自定义事件 首先要指定好谁充当发布者: 然后给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者: 最后发布消息时,发布者会遍历这个缓存列表,依次触发里面存放的订阅者回调函数. 另外,我们还可以往回调函数里填入

javascript设计模式学习之八_发布订阅模式

一.发布订阅模式定义 发布订阅模式又叫做观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.发布—订阅模式可以取消对象之间硬编码的通知机制.javascript中的事件机制就属于发布订阅模式的一种. 二.发布订阅模式使用案例 2.1网站登录 假设正在开发一个网站,网站里面有header头部,nav导航,消息列表,购物车等模块,

JavaScript设计模式之----原生JS实现简单的发布订阅模式

第一部分: 发布订阅模式简介 发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在javascript开发中,一般用事件模型来替代传统的发布—订阅模式. 发布—订阅模式可以广泛应用于异步编程中,是一种替代传递回调函数的方案.比如,可以订阅ajax请求的error.success等事件.或者如果想在动画的每一帧完成之后做一些事情,可以订阅一个事件,然后在动画的每一帧完成之后发布这个事件.在异步编程中使用发布—订阅模式,就无需过

设计模式 - 发布-订阅者模式

1.发布-订阅者 设计模式 定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知 观察者模式和发布订阅模式区别 观察者模式是由具体目标(发布者/被观察者)调度的,而发布/订阅模式是由独立的调度中心进行调度,所以观察者模式的订阅者与发布者之间是存在依赖的,而发布/订阅模式则不会:可以说发布订阅模式是观察者模式进一步解耦,在实际中被大量运用的一种模式 ** 观察者模式 ** 1.定义/解析 目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更

设计模式--观察者模式(发布订阅模式)

观察者模式又叫做发布—订阅模式,是我们最常用的设计模式之一.它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知和更新. 观察者模式提供了一个订阅模型,其中对象订阅事件并在发生时得到通知,这种模式是事件驱动的编程基石,它有利益于良好的面向对象的设计. 从上面的话语我们可以得知,观察者模式主要动力是促进形成松散耦合(解耦). 设计思路: 首先先声明一个观察者对象 // 注册观察者对象 var Observer = (function (){ var Oms