/**
* 观察者模式定义:Subject维持一系列它的对象Observer,当有关状态发生变更时Subject对象则会通知一系列Observer对象进行更新。
* 在Subject对象添加了一系列Observer对象之后,Subject维持一系列Observer对象,当有关状态发生变更时Subject对象则会通知这
* 一系列Observer对象进行更新
* splice讲解(当前的索引,截取的个数,增加的数字)
* @param 1个参数
* @patam 2个参数
* @param 3个参数
*/
function Subject() {
this.observers = [];
}
Subject.prototype = {
add: function (observer) {
this.observers.push(observer);
},
remove: function (observer) {
var observers = this.prototype;
for (var i = 0; i < observers.length; i++) {
if (observers[i] === observer) {
this.observers.splice(i, 1)
}
}
},
notify: function () {
var observers = this.observers;
for (var i = 0; i < observers.length; i++) {
observers[i].notify();
}
}
}
var sub = new Subject();
var obs1 = new Observer('t1');
var obs2 = new Observer('t2');
Observer.prototype = {
update: function () {
console.log('my name is' + this.name);
}
}
sub.add(obs1);
sub.add(obs2);
sub.notify();
/**
* 发布订阅模式指的是希望接收通知的对象(Subscriber)基于一个主题通过自定义事件订阅主题,被激活事件的对象(Publisher)通过发布主题事件的方式通知各个订阅该主题的 Subscriber 对象。
*
*/
let pubSub = {
list: {},
// 订阅
subscribe: function (key, fn) {
if (!this.list[key]) {
this.list[key] = [];
};
this.list[key].push(fn);
},
// 发布
publish: function () {
let arg = arguments;
let key = [].shift.call(arg);
let fns = this.list(key);
if (!fns || fns.length <= 0) return;
for (var i = 0; i < fns.length; i++) {
fns[i].apply(this, arg);
}
},
// 取消订阅
unSubscribe: function (key) {
delete this.list[key];
}
}
pubSub.subscribe('name', (name) => {
console.log('your name is' + name);
})