设计模式是一种解决问题的思路,而非固定的公式
定义:
是一对多的关系依赖关系,当被依赖的对象的状态发生变化了,那么所有依赖他的对象都会得到通知
观察者模式有主体和观察者组成.主体负责发布事件,观察者负责订阅这些事件来观察主体.主体并不知道观察者的任何事情,观察者知道主体能注册事件的回调函数
白话解释:
在写案例前,我们在学过的知识里也有用到观察者思想,应用场景有哪些
<script> //定义商家 var sj = {}; //定义预定列表 sj.orderList = {} //将增加的订阅者添加到列表中(订阅方法) sj.listen = function(id,info){ //如果存在 if(!this.orderList[id]) { //预定列表 this.orderList[id] = []; } //将用于的 this.orderList[id].push(info); } //发布消息(发布方法) sj.publish = function(){ var id = Array.prototype.shift.call(arguments); var infos = this.orderList[id]; if(!infos || infos.length ===0) { console.log('您还没有预定信息') return false; } for(var i =0 ; i<infos.length;i++) { console.log('预定成功'); console.log('尊敬的用户'); infos[i].apply(this,arguments) console.log("到货了") } } //取消订阅 sj.remove = function(id,fn) { var infos = this.orderList[id]; if(!infos){return false} if(!fn) { console.log(123); }else{ for(var i= 0;i<infos.length;i++) { if(infos[i]===fn) { infos.splice(i,1); } } } } let customA = function(){ console.log('黑色尊享版本一台') } let arr = [1,2,3,4,5,6] for(let i=0;i<arr.length;i++) { arr.splice(i,1) } sj.listen('111',customA) sj.remove('111',customA) sj.publish('111') </script>
var Event = { on:function (eventName,callback) { if(!this.handle){ Object.defineProperty(this,'handle',{ configurable:true, // 是否可以删除 enumerable:false,//目标属性是否可以被枚举(遍历) value:{}, writable:true //是否可以重写 }) } if(!this.handle[eventName]) { this.handle[eventName]=[] } this.handle[eventName].push(callback) }, emit:function (eventName) { if(!this.handle[eventName]) { return false } else{ for(let i = 0;i<this.handle[eventName].length;i++) { this.handle[eventName][i](arguments[1]) } } } } /* 测试一 */ Event.on('test', function (result) { console.log(result); }); Event.on('test', function () { console.log('test'); }); Event.emit('test', 'hello world'); // 输出 'hello world' 和 'test' /* 测试二 */ var person1 = {}; var person2 = {}; Object.assign(person1, Event); Object.assign(person2, Event); person1.on('call1', function () { console.log('person1'); }); person2.on('call2', function () { console.log('person2'); }); person1.emit('call1'); // 输出 'person1' person1.emit('call2'); // 没有输出 person2.emit('call1'); // 没有输出c
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:设计模式 之 观察者模式 - Python技术站