观察者模式(发布订阅模式)

假设员工A负责预加载资源模块的开发(loadSource),任何模块都要在资源加载完毕后才可以执行。
员工B负责地图模块的开发(initMap);

loadSource(sourcArr, function() {
  initMap();
});

一切都跟按计划的一样完美,忽然有一天需要增加一个声音模块(initSound), 不巧的是负责loadSource模块的人出去旅游了。 员工C又是个新来的,对loadSource模块不熟,生怕把别人的代码搞坏了。

这个时候我们可以用"观察者模式"重写loadSource模块,向外部暴露一个loaded事件。

loadSource(sourceArr, function() {
  loadSource.emmit('loaded');
});

于是 员工C就可以拿着员工A暴露给他的事件,注册自己的initSound方法

loadSource.bind('loaded', function() {
  initSound();
});

员工B则加一段

loadSource.bind('loaded', function() {
  initMap();
});

而员工A现在只需要关注资源是否加载完毕,而不用去关心资源加载完毕后需要调哪些模块。

完美~~

自娱自乐


文章._list = []; //注册列表

//报社
文章.bind("出轨", function() {    //文章._list = [ 写八卦]
   //写八卦
});

//狗仔队
文章.bind("出轨", function() { //文章._list = [ 写八卦, 偷拍]
  //偷拍
});

//文章本人
文章.bind("出轨", function() {  //文章._list = [ 写八卦, 偷拍, 辟谣]
  //辟谣
});

//马伊俐的粉丝
文章.bind("出轨", function() {
  // 痛斥小三
});

//文章的粉丝
文章.bind("出轨", function() {
  // 力挺偶像
});

//还有很多路人甲乙丙丁,都可以注册文章的出轨事件

//文章._list = [ fn, fn, fn ... fn] //就会有很多很多的事件
//文章.emit("出轨"); //一旦"出轨“,注册过的事件都会爆发。。。 好可怕~~

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