发布订阅者模式和观察者模式

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、观察者模式,需要将观察者自身(对象)注册到消息队列中,等到有消息变动时,更新观察者的更新函数

你可能感兴趣的:(发布订阅者模式和观察者模式)