观察者模式案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<label>信息更新:<input type="text" id="publish" placeholder="请输入用户名称" /></label><br /><br />
        <label>观察者一:<input type="text" id="obs1" readonly /><button id="btn1">注销</button><button id="q1">启用</button></label><br />
        <label>观察者二:<input type="text" id="obs2" readonly /><button id="btn2">注销</button><button id="q2">启用</button></label>
	</body>
</html>
<script type="text/javascript">
	
	var publish = document.getElementById("publish");
	var obs1 = document.getElementById("obs1");
	var obs2 = document.getElementById("obs2");
	var btn1 = document.getElementById("btn1");
	var btn2 = document.getElementById("btn2");
	var q1 = document.getElementById("q1");
	var q2 = document.getElementById("q2");
	
	//信息更新类
	function Publish(obj){
		//信息文本框
		this.obj=obj;
		//保存所有的观察者
		this.abservers=[];
		var state="";//不能让外部随意使用更新后的信息
		
	    //用于观察者接受更新后的信息
	    this.getState=function(){
	    	return state;
	    }
	    //设置信息(更新后的信息需要设置)
	    this.setState=function(value){//value更新后的值
	    	state=value;
	    	this.notice();
	    }
	    
	   }
	   
	   Publish.prototype.addObs=function(observer){
	   	var flag=false;//表示观察者不存在
	   	for(var i=0;i<this.abservers.length;i++){
	   		if(this.abservers[i]===observer){
	   			flag=true;//表示观察者存在
	   		}
	   }
	   if(!flag){//观察者不存在
	   	this.abservers.push(observer);
	   }
	   }
	   //禁用就删除此观察者
	   Publish.prototype.removeObs=function(observer){
	   	for(var i=0;i<this.abservers.length;i++){
	   		if(this.abservers[i]===observer){
	   			this.abservers.splice(i,1);
	   		}
	   	}
	   }
	    
	   Publish.prototype.notice=function(){
	   	//观察者收到更新的信息
	   	for(var i=0;i<this.abservers.length;i++){
	   		this.abservers[i].updateState(this.getState());
	   	}
	   }
	   
	   //观察者类
	   function Observer(obj){
	   	//把更新的内容拿到手
	   	this.obj=obj;
	   	
	   	//添加一个updateState,用来接收更新后的内容
	   	this.updateState=function(state){
	   		//state接收更新后的内容
	   		this.obj.value=state;
	   }
	}
	   
	   var obs1=new Observer(obs1);
	   var obs2=new Observer(obs2);
	   
	   var pub=new Publish(publish);
	   pub.addObs(obs1);
	   pub.addObs(obs2);
	   
	   pub.obj.onkeyup=function(){
	   	
	   //当信息更新后,可以开始设置更新后的内容,一遍观察者接受更新后的信息
	   //开始设置更新后的内容
	   pub.setState(this.value);
	   
	}
	
	btn1.onclick=function(){
	pub.removeObs(obs1);	
	}
	btn2.onclick=function(){
	pub.removeObs(obs2);	
	}
	q1.onclick=function(){
		pub.addObs(obs1);
	}
	q2.onclick=function(){
		pub.addObs(obs2);
	}
	
</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值