- 浏览: 337063 次
- 性别:
- 来自: 广州
文章分类
最新评论
<!doctype html>
<html>
<head>
<title>javascript 观察者模式 by 司徒正美</title>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
</head>
<body>
<script type="text/javascript">
var dom = {
each : function(obj,fn,score){
for(var key in obj){
if(obj.hasOwnProperty(key))
fn.call(score,obj[key],key,obj)
}
}
};
dom.each({
indexOf: function (el, index) {
var n = this.length,
i = index == null ? 0 : index < 0 ? Math.max(0, n + index) : index;
for (; i < n; i++)
if (i in this && this[i] === el) return i;
return -1;
},
//移除 Array 对象中指定位置的元素。
removeAt: function (index) {
return this.splice(index, 1)
},
//移除 Array 对象中某个元素的第一个匹配项。
remove: function (item) {
var index = this.indexOf(item);
if (index !== -1) this.removeAt(index);
return item;
}
},function(method,name){
if(!Array.prototype[name])
Array.prototype[name] = method;
});
/* 订阅者接口 */
var Observer = function() {
//观察者要实现的方法
this.update = function() {throw "此方法必须被实现!"}
}
/* 发布者接口 */
var Subject = function() {
this.observers = [];
}
Subject.prototype = {
//如果状态发生改变,通知所有观察者调用其update方法
notifyObservers : function(context) {
for(var i = 0, n = this.observers.length; i < n; i++) {
this.observers[i].update(context);
}
},
// 添加订阅者
attach : function(observer){
if(!observer.update) throw 'Wrong observer';
this.observers.push(observer);
},
/* 移除订阅者 */
detach : function(observer) {
if(!observer.update) { throw 'Wrong observer'; }
this.observers.remove(observer);
}
}
//实现接口
var implement = function(Concrete,Interface){
for(var prop in Interface) {
Concrete[prop] = Interface[prop];
}
}
/***************** 发布者的实现类 ***********************/
var mainCheck = document.createElement("input");
mainCheck.type = 'checkbox';
mainCheck.id = 'MainCheck';
mainCheck.style.cssText = 'border:1px solid red';
implement( mainCheck,new Subject());
/* 当点击按钮的时候 给相关的观察者发送通知. 观察者接收到通知的时候 改变状态 */
mainCheck['onclick'] = function(){
this.notifyObservers(this.checked)
}
document.body.appendChild(mainCheck);
/********************* 订阅者的实现类 *****************************/
var obsCheck1 = document.createElement('input');
var obsCheck2 = document.createElement('input');
obsCheck1.type = 'checkbox';
obsCheck1.id = 'Obs1';
document.body.appendChild(obsCheck1);
obsCheck2.type = 'checkbox';
obsCheck2.id = 'Obs2';
document.body.appendChild(obsCheck2);
implement( obsCheck1,new Observer());
implement( obsCheck2,new Observer());
/* 必须实现它们的具体update方法 */
obsCheck1.update = function(value) {
this.checked = value;
}
obsCheck2.update = function(value) {
this.checked = value;
}
// 将发布者和订阅者(观察者)关联
mainCheck.attach(obsCheck1);
mainCheck.attach(obsCheck2);
</script>
</body>
</html>
原文出处:http://www.cnblogs.com/rubylouvre/archive/2010/03/29/1699203.html
在推荐一本好书:http://product.china-pub.com/508886
http://www.jspatterns.com/category/patterns/coding-practices/
http://shichuan.github.com/javascript-patterns/#general-patterns
发表评论
-
EasyUI和EasyUI桌面App
2013-04-15 11:56 1171http://fxz-2008.iteye.com/blog/ ... -
Jquery进度条
2013-04-12 09:08 837http://www.cnblogs.com/lhb25/ h ... -
11个适合触摸事件开发的JavaScript库
2013-04-10 09:23 799http://www.codecto.com/2012/08/ ... -
Jquery插件
2013-03-22 18:33 777http://www.cnblogs.com/ywqu/arc ... -
宝贝鱼
2013-03-18 23:54 671http://code.google.com/p/cshbbr ... -
HTML&JS MVC
2013-03-15 16:27 602http://www.bootcss.com/ http:// ... -
浏览器内核及Js引擎介绍
2013-03-15 16:18 733http://wenku.baidu.com/view/623 ... -
EXTJS Demo
2013-03-12 17:19 787http://web230531.host89.chinajs ... -
网站架构和两个3d技术
2013-01-17 16:52 0http://blog.csdn.net/lovingprin ... -
DWR数据反推实例
2013-01-16 16:42 1407http://blog.sina.com.cn/s/blog_ ... -
javascript调用服务端方法
2012-12-17 22:03 934http://www.php100.com/html/webk ... -
DWR推送技术
2012-12-13 16:13 10628DWR2.x的推技术也叫DWR Reverse Ajax(逆向 ... -
wireshark 协议过滤
2012-10-09 11:32 1607http://blog.csdn.net/cumirror/a ... -
一个很不错的Javascript绘图库
2012-09-27 17:18 0http://www.jgraph.com/ http://w ... -
dwr推送数据
2012-09-21 16:59 0Dwr数据推技术:http://blog.csdn.net/k ... -
Extjs4 Css美工相关
2012-09-03 10:39 2980转: http://www.sencha.com/lear ... -
Extjs下拉树组件
2012-09-03 09:40 963转: http://www.2cto.com/kf/20120 ... -
Javascript基础一(apply, call, arguments, prototype)
2012-08-22 22:42 1060//javascript: apply, call, argu ... -
Extjs4的事件实例
2012-08-09 09:11 781http://www.cnblogs.com/luluping ... -
EXTJS中的Store是如何工作的
2012-08-08 21:04 935http://idoa3l3x.blogbus.com/log ...
相关推荐
一个比较有意思的js库可以为javascript的对象实现观察者模式,以往我们使用javascript实现的观察者模式都是通过使用回调函数配合dom上的event事件来操作的,而“Watch.js”可以为javascript的对象实现观察者模式,...
### JavaScript观察者模式详解 #### 一、观察者模式概念 观察者模式(Observer Pattern)是一种行为设计模式,用于定义对象间的一种一对多依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都会得到...
JavaScript观察者模式是一种基于事件驱动的设计模式,它允许对象在状态改变时自动通知其他相关对象。这个模式在软件开发中非常常见,特别是在JavaScript这样的动态语言中,因为JavaScript的事件模型就是观察者模式的...
### JavaScript观察者模式实现自动刷新效果 #### 一、引言 在JavaScript开发中,观察者模式(Observer Pattern)是一种常见的设计模式,用于处理对象之间的依赖关系。它定义了一种一对多的依赖关系,以便当一个...
以下是一个简单的JavaScript观察者模式实现: ```javascript class Subject { constructor() { this.observers = []; } addObserver(observer) { this.observers.push(observer); } removeObserver...
在JavaScript这种事件驱动的语言中,观察者模式有着天然的应用场景,比如DOM事件的处理、Ajax请求的响应等。 观察者模式主要包含以下几种角色: 1. Subject(被观察者):它持有注册的观察者的列表,并负责在状态...
总结来说,JavaScript观察者模式是一种强大的工具,它可以简化代码结构,提高代码可维护性,尤其在需要处理复杂的交互和实时数据同步时。通过理解并应用这个模式,开发者可以更有效地构建可扩展和灵活的应用程序。
本文实例讲述了JavaScript观察者模式(publish/subscribe)原理与实现方法。分享给大家供大家参考,具体如下: 观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这...
在JavaScript中,观察者模式可以通过多种方式实现,包括自定义事件、发布/订阅模式等。本文将详细介绍如何在JavaScript中实现观察者模式,并探讨其在现代Web开发中的应用。 观察者模式是JavaScript中实现事件驱动...
### JavaScript设计模式详解:单例模式与观察者模式 #### 一、单例模式 **定义**:单例模式是一种常用的软件设计模式,其目的是确保某个类只有一个实例,并且能够提供一个全局访问点来访问该实例。在JavaScript中...
这个例子展示了如何在JavaScript中使用观察者模式来实现自动刷新效果,比如实时显示数据变化。这种模式在响应式编程、状态管理以及用户界面的实时更新等场景中非常有用。通过观察者模式,我们能够创建松耦合的系统,...
除了标准实现,还有很多其他语言和框架提供了观察者模式的支持,例如在C#中,可以使用System.ComponentModel.INotifyPropertyChanged接口来实现,而在JavaScript中,可以通过事件监听器或者发布/订阅模式来实现类似...
在实际开发中,很多框架和库也内置了观察者模式,如JavaScript中的EventEmitter(Node.js)、C#的事件和委托,以及Android中的BroadcastReceiver等。这些工具使得开发者可以更便捷地应用观察者模式,提高代码的可...
【JavaScript源代码】详解从vue的组件传值着手观察者模式 在JavaScript中,Vue框架是一种广泛应用的前端开发工具,其核心设计思想包含了观察者模式的元素。观察者模式是一种软件设计模式,它定义了对象间的一种一对...
本篇文章将深入探讨JavaScript的OOP思想,并通过实际代码示例介绍单例模式、工厂模式和观察者模式。 首先,面向对象编程的核心概念是类和对象。在JavaScript中,虽然没有传统的类定义,但可以通过构造函数来模拟类...