`
rockyuse
  • 浏览: 195406 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

js 观察者模式

 
阅读更多
<!doctype html>
<html lang="en">
<head>
<title>JavaScript Patterns</title>
<meta charset="utf-8">
</head>
<body>
<script>
	var toString = {}.toString,
		isFunction = function( it ) {
			return toString.call( it ) == "[object Function]";
		},

		isString = function( it ) {
			return toString.call( it ) == "[object String]";
		};

	var hub = (function() {
		var identifier = 1,
			channels = {},
			counter = {};

		return {
			subscribe: function( name, listener ) {
				if ( !isString(name) || !isFunction(listener) ) {
					return;
				}

				var done = channels[name];

				if ( !done ) {
					done = channels[name] = {};
					counter[name] = 0;
				}

				done[identifier] = listener;
				counter[name] += 1;

				return [ name, identifier++ ];
			},

			publish: function( name ) {
				var done, args, index;

				if ( !name || !isString(name) ) {
					return;
				}

				done = channels[name];
				args = [].slice.call( arguments, 1 );

				for ( index in done ) {
					done[index].apply( this, args );
				}
			},

			unsubscribe: function unsubscribe( handle ) {
				var isa = isArray( handle ),
					name = isa ? handle[0] : handle,
					done;

				if ( !name || !isString(name) ) {
					return;
				}

				done = channels[name];

				if ( isa ) {
					counter[name] -= 1;
					delete done[handle[1]];
				}

				if ( !isa || counter[name] === 0 ) {
					delete channels[name];
					delete counter[name];
				}
			}
		};
	})();

	hub.subscribe('a', function(){
		console.log(123);
	});
	hub.subscribe('a', function(){
		console.log(456);
	});

	console.log(hub)

	hub.publish('a')

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

 https://github.com/shichuan/javascript-patterns/blob/master/design-patterns/observer.html

 

http://icodon.com/observer-pattern-of-js.html

 

http://amplifyjs.com/api/pubsub/

 

http://rolfzhang.com/articles/927.html

 

<!doctype html>
<html lang="en">
<head>
<title>JavaScript Patterns</title>
<meta charset="utf-8">
</head>
<body>
<script>
(function( global, undefined ) {
var slice = [].slice,
	subscriptions = {};

var amplify = global.amplify = {
	publish: function( topic ) {
		var args = slice.call( arguments, 1 ),
			topicSubscriptions,
			subscription,
			length,
			i = 0,
			ret;

		if ( !subscriptions[ topic ] ) {
			return true;
		}

		topicSubscriptions = subscriptions[ topic ].slice();
		for ( length = topicSubscriptions.length; i < length; i++ ) {
			subscription = topicSubscriptions[ i ];
			ret = subscription.callback.apply( subscription.context, args );
			if ( ret === false ) {
				break;
			}
		}
		return ret !== false;
	},

	subscribe: function( topic, context, callback, priority ) {
		if ( arguments.length === 3 && typeof callback === "number" ) {
			priority = callback;
			callback = context;
			context = null;
		}
		if ( arguments.length === 2 ) {
			callback = context;
			context = null;
		}
		priority = priority || 10;

		var topicIndex = 0,
			topics = topic.split( /\s/ ),
			topicLength = topics.length,
			added;
		for ( ; topicIndex < topicLength; topicIndex++ ) {
			topic = topics[ topicIndex ];
			added = false;
			if ( !subscriptions[ topic ] ) {
				subscriptions[ topic ] = [];
			}
	
			var i = subscriptions[ topic ].length - 1,
				subscriptionInfo = {
					callback: callback,
					context: context,
					priority: priority
				};
	
			for ( ; i >= 0; i-- ) {
				if ( subscriptions[ topic ][ i ].priority <= priority ) {
					subscriptions[ topic ].splice( i + 1, 0, subscriptionInfo );
					added = true;
					break;
				}
			}

			if ( !added ) {
				subscriptions[ topic ].unshift( subscriptionInfo );
			}
		}

		return callback;
	},

	unsubscribe: function( topic, callback ) {
		if ( !subscriptions[ topic ] ) {
			return;
		}

		var length = subscriptions[ topic ].length,
			i = 0;

		for ( ; i < length; i++ ) {
			if ( subscriptions[ topic ][ i ].callback === callback ) {
				subscriptions[ topic ].splice( i, 1 );
				break;
			}
		}
	}
};

}(this));


	amplify.subscribe('a', function(){
		console.log(123);
	});
	amplify.subscribe('a', function(){
		console.log(456);
	});

	console.log(amplify)

	amplify.publish('a')

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

 

分享到:
评论

相关推荐

    js观察者模式列子js观察者模式列子

    总结来说,JavaScript观察者模式是一种强大的工具,它可以简化代码结构,提高代码可维护性,尤其在需要处理复杂的交互和实时数据同步时。通过理解并应用这个模式,开发者可以更有效地构建可扩展和灵活的应用程序。

    javascript观察者模式Watch.JS.zip

    一个比较有意思的js库可以为javascript的对象实现观察者模式,以往我们使用javascript实现的观察者模式都是通过使用回调函数配合dom上的event事件来操作的,而“Watch.js”可以为javascript的对象实现观察者模式,...

    javascript观察者模式有什么方法_javascript观察者模式有哪些方法.docx

    ### JavaScript观察者模式详解 #### 一、观察者模式概念 观察者模式(Observer Pattern)是一种行为设计模式,用于定义对象间的一种一对多依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    javascript实现观察者模式

    以下是一个简单的JavaScript观察者模式实现: ```javascript class Subject { constructor() { this.observers = []; } addObserver(observer) { this.observers.push(observer); } removeObserver...

    JavaScript观察者模式(经典).docx

    JavaScript观察者模式是一种基于事件驱动的设计模式,它允许对象在状态改变时自动通知其他相关对象。这个模式在软件开发中非常常见,特别是在JavaScript这样的动态语言中,因为JavaScript的事件模型就是观察者模式的...

    javascript观察者模式实现自动刷新效果.docx

    ### JavaScript观察者模式实现自动刷新效果 #### 一、引言 在JavaScript开发中,观察者模式(Observer Pattern)是一种常见的设计模式,用于处理对象之间的依赖关系。它定义了一种一对多的依赖关系,以便当一个...

    JavaScript观察者模式(经典)

    在JavaScript这种事件驱动的语言中,观察者模式有着天然的应用场景,比如DOM事件的处理、Ajax请求的响应等。 观察者模式主要包含以下几种角色: 1. Subject(被观察者):它持有注册的观察者的列表,并负责在状态...

    观察者模式最佳实践

    此外,现代前端框架如React和Vue.js也利用类似的观察者模式实现组件间的通信和状态管理。 总之,掌握观察者模式可以帮助我们构建更加灵活、可扩展的系统,提高代码的复用性和可维护性。通过最佳实践的学习,可以...

    观察者模式(Observer)

    在实际开发中,很多框架和库也内置了观察者模式,如JavaScript中的EventEmitter(Node.js)、C#的事件和委托,以及Android中的BroadcastReceiver等。这些工具使得开发者可以更便捷地应用观察者模式,提高代码的可...

    观察者模式学习

    除了标准实现,还有很多其他语言和框架提供了观察者模式的支持,例如在C#中,可以使用System.ComponentModel.INotifyPropertyChanged接口来实现,而在JavaScript中,可以通过事件监听器或者发布/订阅模式来实现类似...

    JavaScript中的观察者模式:构建响应式编程的基石

    在JavaScript中,观察者模式可以通过多种方式实现,包括自定义事件、发布/订阅模式等。本文将详细介绍如何在JavaScript中实现观察者模式,并探讨其在现代Web开发中的应用。 观察者模式是JavaScript中实现事件驱动...

    【JavaScript源代码】详解从vue的组件传值着手观察者模式.docx

    【JavaScript源代码】详解从vue的组件传值着手观察者模式 在JavaScript中,Vue框架是一种广泛应用的前端开发工具,其核心设计思想包含了观察者模式的元素。观察者模式是一种软件设计模式,它定义了对象间的一种一对...

    JavaScript设计模式中的单例模式和观察者模式.docx

    ### JavaScript设计模式详解:单例模式与观察者模式 #### 一、单例模式 **定义**:单例模式是一种常用的软件设计模式,其目的是确保某个类只有一个实例,并且能够提供一个全局访问点来访问该实例。在JavaScript中...

    js观察者模式的弹幕案例

    本文实例为大家分享了js观察者模式的弹幕案例代码,供大家参考,具体内容如下 观察者模式的弹幕案例 上代码 弹幕.html: &lt;!DOCTYPE html&gt; &lt;html lang=en&gt; &lt;head&gt; &lt;meta charset=UTF-8&gt; &lt;...

    JavaScript观察者模式(publish/subscribe)原理与实现方法

    本文实例讲述了JavaScript观察者模式(publish/subscribe)原理与实现方法。分享给大家供大家参考,具体如下: 观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这...

    观察者模式.pdf

    在JavaScript中,观察者模式也被称为发布者-订阅者模式,其中包含两个主要角色:发布者(Publisher)和订阅者(Subscriber)。 1. 发布者(Publisher): 发布者是状态发生变化的对象,当它的状态改变时,会通知...

    我理解的 js 的观察者模式 Observable

    在JavaScript中,`EventEmitter`是Node.js中的一个核心模块,它是实现观察者模式的一个典型例子。开发者可以通过`.on()`方法订阅事件,通过`.emit()`方法触发事件并通知所有订阅者。此外,`CustomEventTarget`接口在...

    javascript的oop思想以及单例,工厂,观察者模式简例

    本篇文章将深入探讨JavaScript的OOP思想,并通过实际代码示例介绍单例模式、工厂模式和观察者模式。 首先,面向对象编程的核心概念是类和对象。在JavaScript中,虽然没有传统的类定义,但可以通过构造函数来模拟类...

    PHP观察者模式实例分析【对比JS观察者模式】

    在JavaScript中,我们可以看到一个简单的观察者模式实现。在给出的例子中,`select`元素作为被观察者,当用户选择不同的选项时,`select`元素会触发`onchange`事件。这个事件会通知所有已注册的观察者(`content`、`...

Global site tag (gtag.js) - Google Analytics