observeMode
<!DOCTYPE html>
<html>
<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../jquery/jquery-1.8.0.min.js"></script>
		<script type="text/javascript">
			 //观察者模式:对程序中某一个对象的进行实时的观察,当该对象状态发生改变的时候,进行通知
			 //观察者、被观察者
			 //经典案例:订报纸:(报社(发布者)、订阅者)
			 //发布者(被观察者)
			var Publish = function(name) {
					this.name = name;
					this.subscribers = []; //接受所有的订阅者(每一个元素是函数类型fn)数组
				}
				//报社:Publish类的实例对象发布消息的方法
			Publish.prototype.deliver = function(news) {
					var publish = this;
					this.subscribers.forEach(function(item) {
						var fn = item;
						fn(publish, news); //把新消息发给一个订阅者
					})
					return this; //链式编程
				}
				//订阅者:订阅报纸的方法
			Function.prototype.subscribe = function(publish) {
					var sub = this; //取得具体订阅者这个人 z3
					//some方法:循环遍历数组的每一个元素,执行一个函数,如果其中有一个返回true,那么整体返回true
					var alreadyExists = publish.subscribers.some(function(item) { //[z4,z5,z6,z7]
						return item === sub
					});
					//如果当前出版蛇不存在这个人,则将其加入其中
					if (!alreadyExists) {
						publish.subscribers.push(this);
					}
					return this;
				}
				//订阅者取消订阅
			Function.prototype.unsubscribe = function(publish) {
				var sub = this; //取得具体订阅者这个人 z3
				//filter方法:循环遍历数组的每一个元素,执行一个函数如果return 为false,则删除该元素
				publish.subscribers.filter(function(item) {
					return item !== sub
				})
				return this;
			}
			window.onload = function() {
				//实例化发布者对象(报社对象、被观察者)
				var pub1 = new Publish("报社一");
				var pub2 = new Publish("报社二");
				var pub3 = new Publish("报社三");
//观察者(订阅者)
				var sub1 = function(publish,news){
					$('#sub1').append('来自'+publish.name+'消息是'+news+"<br/>")
				}
				var sub2 = function(publish,news){
					$('#sub2').append('来自'+publish.name+'消息是'+news+"<br/>")
				}
				sub1.subscribe(pub1).subscribe(pub2).subscribe(pub3)
				sub2.subscribe(pub1).subscribe(pub2);
//事件绑定
				$('#pub1').click(function(){
					pub1.deliver($('#text1').val())
				})
				$('#pub2').click(function(){
					pub2.deliver($('#text2').val())
				})
				$('#pub3').click(function(){
					pub3.deliver($('#text3').val())
				})
			}
		</script>
	</head>
<body>
		<input id="pub1" type="button" value="报社一" />
		<input id="text1" />
		<br />
		<input id="pub2" type="button" value="报社二" />
		<input id="text2" />
		<br />
		<input id="pub3" type="button" value="报社三" />
		<input id="text3" />
		<br />
		<textarea cols="20" rows="5" id="sub1"></textarea>
		<textarea cols="20" rows="5" id="sub2"></textarea>
	</body>
</html>
observeMode的更多相关文章
随机推荐
- Windows下Redis的安装使用[转]
			
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
 - 清理300多台MySQL数据库的过期binlog日志
			
早晨睡梦中,被 on-call了,说磁盘报警,赶紧起来打开email,收到上百封email报警,数据库磁盘不够了,查询了原因 [xxx@xxxx cacti]$ ssh xxxx "df - ...
 - typename使用在模板中区分static成员和类型
			
16.19 编写函数,接受一个容器的引用,打印容器中的元素,使用容器的size_type和size成员来控制打印元素的循环. 16.20 重写上一题的函数,使用begin和end返回的迭代器来控制循环 ...
 - Chapter 3 - How to Move a sprite
			
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=250529 http://www.cocos2d-x.org/boards/6/ ...
 - Keepalived+Nginx+Tomcat配置高可用负载均衡系统示例
			
前言 此示例为keepalived+nginx+tomcat的基础配置示例,某些特定配置此例中不会出现,在示例中会用到三个虚拟机:两个纯命令行用于模拟服务端配置,一个带桌面环境的用于模拟客户端访问,这 ...
 - popupWindow使用详解
			
popupWindow说起来简单,但是使用略麻烦,今天带大家来看看怎么使用,先来看看效果图: 先来看看布局文件吧: <RelativeLayout xmlns:android="htt ...
 - [图文]centos6.3搭建FTP服务器教程
			
我一开始是参照这个教程做的 http://www.linuxren.net/better/centos63-ftp.html 可是问题总是免不了的,我遇到几个问题. 一开始使用terminal的时候一 ...
 - H TML5 之 (1) 初识HTML5
			
新特性 HTML5 中的一些有趣的新特性: 用于绘画的 canvas 元素 用于媒介回放的 video 和 audio 元素 对本地离线存储的更好的支持 新的特殊内容元素,比如 article.foo ...
 - Spring4.3.1 JDBCTemplate操作数据库
			
个人总结,转载请注明出处:http://www.cnblogs.com/lidabnu/p/5679354.html 基于Spring4.3.1官方文档总结,官方文档链接http://docs.spr ...
 - C#中的委托范例学习
			
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...