JavaScript - 观察者模式
什么是观察者模式?
这是一种创建松散耦合代码的技术。它定义对象间 一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。由主体和观察者组成,主体负责发布事件,同时观察者通过订阅这些事件来观察该主体。主体并不知道观察者的任何事情,观察者知道主体并能注册事件的回调函数。
观察者的两个要素
观察者模式最重要的两个要素是:发布者、订阅者(观察者),发布者发送消息,订阅者订阅/删除特定消息并接受发布者发送的消息。
发布-订阅模式的模式简单实现
小明最近看上了一套房子,到了售楼处之后才被告知,该楼盘的房子早已售罄。好在售楼MM告诉小明,不久后还有一些尾盘推出,开发商正在办理相关手续,手续办好后就可以购买。
// 定义售楼处 var salesOffices = {}; // 定义客户花名册 salesOffices.clientList = []; // 定义订阅方法 salesOffices.listen = function (key, fn) { // 花名册登记哪些客户订阅哪些信息(根据key来区分) if (!this.clientList[key]) { this.clientList[key] = []; } this.clientList[key].push(fn); } salesOffices.trigger = function () { // 获取key,获取第一个参数 var key = Array.prototype.shift.call(arguments); var fns = this.clientList[key]; if (!fns || fns.length === 0) { return false; } for (var i = 0, fn; fn = fns[i++];) { fn.apply(this, arguments); } } // 小明定于88平米的楼盘 salesOffices.listen('squareMeter88', function (price) { console.log('price=' + price); }); // 小红定于100平米的楼盘 salesOffices.listen('squareMeter100', function (price) { console.log('price=' + price); }); // 售楼处发布楼盘信息 salesOffices.trigger('squareMeter88', 2000000); salesOffices.trigger('squareMeter100', 3000000);
使用观察者模式的好处:
- 支持简单的广播通信,自动通知所有已经订阅过的对象。
- 页面载入后目标对象很容易与观察者存在一种动态关联,增加了灵活性。
- 目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用。