什么是观察者模式?
这是一种创建松散耦合代码的技术。它定义对象间 一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。由主体和观察者组成,主体负责发布事件,同时观察者通过订阅这些事件来观察该主体。主体并不知道观察者的任何事情,观察者知道主体并能注册事件的回调函数。
观察者的两个要素
观察者模式最重要的两个要素是:发布者、订阅者(观察者),发布者发送消息,订阅者订阅/删除特定消息并接受发布者发送的消息。
发布-订阅模式的模式简单实现
小明最近看上了一套房子,到了售楼处之后才被告知,该楼盘的房子早已售罄。好在售楼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);
观察者模式优点:
1、观察者和被观察者是抽象耦合的。
2、建立一套触发机制。
观察者模式缺点:
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。