<!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>