/**
* 观察者模式定义: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);
})