1、发布订阅者模式
//订阅发布平台应该是一个全局的 var pubsub={}; (function(pubsub){ var topics={}; pubsub.publish=function(topic){ //发布话题,订阅了该话题的都会收到消息 if(!topics[topic]){ //不存在该话题 return; } var funs = topics[topic]; funs.forEach(function(fun){ var count = 6; var timer = setInterval(function(){ fun(count--); if(count==0){ clearInterval(timer); } },1000); }); } pubsub.subscribe=function(topic,fun){ console.info('开启晚餐通知'); if(!topics[topic]){ topics[topic] = [fun]; }else{ topics[topic].push(fun); } } })(pubsub); function dinner(){ pubsub.subscribe('dinner',function(data){ console.info(`还有${data}人在排队`); }); pubsub.publish('dinner'); }
2、观察者模式
//观察者模式 //所有排队吃饭的人都需要监听餐馆的动态,所以吃饭的人是监听者,dinner是监听的一方 //餐馆需要一个叫号的系统List,每次叫号,更新所有排队人的信息 function Resturant(){ //排队的队列 this.list = new List(); this.addDinner = function(dinner){ //加入排队的队列中 this.list.add(dinner); } this.notify = function(){ this.list.get().forEach(function(dinner){ dinner.update(); }); } } function List(){ this.list=[]; this.add = function(dinner){ this.list.push(dinner); } this.get = function(){ return this.list; } } function Dinner(number){ this.update=function(){ console.info(`用餐`); } } var dinner1 = new Dinner(1); var dinner2 = new Dinner(2); var resturant = new Resturant(); resturant.addDinner(dinner1); resturant.addDinner(dinner2); resturant.notify();
发布订阅者和观察者模式之间的区别
1、观察者模式,需要将观察者自身(对象)注册到消息队列中,等到有消息变动时,更新观察者的更新函数