观察者设计模式:observer
面对解决的是 1对多 的问题。
也称为订阅发布模式。
解决的问题:
1:实现多个对象之间的松耦合。
2:当某一个对象执行了某个操作,其他的多个对象都可以接收到通知。
3:被通知接收信息的对象的数量是开放的。
实例:HR 通知 若干个面试者的。
<script>
//隶属于某个公司的hr 。
// 属性:公司的名称,保存应聘者的信息的容器
// 功能:添加观察者、删除观察者、通知观察者。
function HR(name){
this.name=name;
//保存应聘者的信息的容器
this.observers=[];
}
//HR的原型对象中添加上述的功能。
HR.prototype.addObserver=function(obs){
this.observers.push(obs);
}
//删除观察者
HR.prototype.removeObserver=function(obs){
var observers=this.observers;
//遍历所有的应聘者,相同的删除掉。
for(var i=0; i<observers.length; i++){
if(observers[i]===obs){
var .removeObserver=observers.splice ( i , 1 ) [0];
removeObserver.ubdate(removeObserver.name+"先生/女士:很遗憾,希望以后有合作的机会!");
}
}
}
//通知所有的观察者
HR.prototype.notify=function(){
//遍历所有的观察者,执行更新的方法
var observers=this.observers;
for(var i=0; i < observers.length ; i++){
//通知所有遍历观察者,然后更新
observers[i].ubdate(observers[i].name+"\t恭喜先生/女士:下周来"+this.name + "上班");
}
}
//面试者,观察者。 功能就是接收信息。
function Observer(name){
this.name=name;
}
/**
* //接收更新通知的方法
* @param msg 接收到的信息
*/
Observer.prototyle.update=function(msg){
console.log(msg);
}
var hr=new HR("JD");
var gang=new Observers("小刚");
var hua=new Observers("小花");
var bai=new Observers("小白");
//删除小刚
hr.removeObserver(gang);
//通知其他人
hr.notify();
//前面学习的事件处理,就是观察者模式。
document.body.addEventListener("click",function () {
console.log ("body click")
},false);
document.addEventListener("click",function () {
console.log ("document click")
},false);
document.body.click();
</script>