首页 > 语言 > JavaScript > 正文

[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例

2024-05-06 15:12:11
字体:
来源:转载
供稿:网友

发布者订阅者模式,是一种很常见的模式,比如:

一、买卖房子

生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色

中介拿到卖主的房源信息,根据手头上掌握的客户联系信息(买房的人的手机号),通知买房的人,他充当了发布者的角色

卖主想卖掉自己的房子,就需要告诉中介,把信息交给中介发布

二,网站订阅信息的用户

订阅者角色:需要订阅某类信息的网民,如某个网站的javascript类型文章

发布者角色:邮箱服务器,根据网站收集到的用户订阅邮箱,通知用户.

网站主想把信息告诉订阅者,需要把文章相关内容告诉邮箱服务器去发送

等等非常多的例子,不一一列举

本文用网站订阅的方式,推导发布者-订阅者框架,然后用发布者-订阅者框架来重构一个简单的购物车

var Site = {};    Site.userList = [];    Site.subscribe = function( fn ){      this.userList.push( fn );    }    Site.publish = function(){      for( var i = 0, len = this.userList.length; i < len; i++ ){        this.userList[i].apply( this, arguments );      }     }    Site.subscribe( function( type ){      console.log( "网站发布了" + type + "内容" );    });    Site.subscribe( function( type ){      console.log( "网站发布了" + type + "内容" );    });    Site.publish( 'javascript' );    Site.publish( 'html5' );

Site.userList就是用来保存订阅者

Site.subscribe就是具体的订阅者,把每一个订阅者订阅的具体信息保存在Site.userList

Site.publish就是发布者:根据保存的userList,一个个遍历(通知),执行里面的业务逻辑

但是这个,发布订阅者模式,有个问题,不能订阅想要的类型,上例我加了2个订阅者(第11行,第14行),只要网站发了信息,全部能收到,但是有些用户可能只想收到javascript或者html5的,所以,接下来,我们需要继续完善,希望能够接收到具体的信息,不是某人订阅的类型,就不接收

var Site = {};    Site.userList = {};    Site.subscribe = function (key, fn) {      if (!this.userList[key]) {        this.userList[key] = [];      }      this.userList[key].push(fn);    }    Site.publish = function () {      var key = Array.prototype.shift.apply(arguments),        fns = this.userList[key];      if ( !fns || fns.length === 0) {        console.log( '没有人订阅' + key + "这个分类的文章" );        return false;      }      for (var i = 0, len = fns.length; i < len; i++) {        fns[i].apply(this, arguments);      }    }    Site.subscribe( "javascript", function( title ){      console.log( title );    });    Site.subscribe( "es6", function( title ){      console.log( title );    });    Site.publish( "javascript", "[js高手之路]寄生组合式继承的优势" );    Site.publish( "es6", "[js高手之路]es6系列教程 - var, let, const详解" );    Site.publish( "html5", "html5新的语义化标签" );            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选