订阅、发布模式

看汤姆大叔的博客,记录学习下订阅、发布模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

function Event(name) {
var handlers = [];

this.getName = function() {
return name;
};

this.addHandler = function(handler) {
handlers.push(handler)
};

this.removeHandler = function(handler) {
for(var i = 0; i< handlers.length; i++) {
if(handlers[i] == handler) {
handlers.splice(i, 1);
break;
}
}
};

this.fire = function(eventArgs) {
handlers.forEach(function(h) {
h(eventArgs);
});
};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

function EventAggregator() {

var events = [];

function getEvent(eventName) {
return events.filter(event => {
return event.getName() === eventName;
})[0]
}

this.publish = function(eventName, eventArgs) {
var event = getEvent(eventName);

if(!event) {
event = new Event(eventName);
events.push(event);
}

event.fire(eventArgs);
};

this.subscribe = function(eventName, handler) {
var event = getEvent(eventName);

if(!event) {
event = new Event(eventName);
events.push(event);
}

event.addHandler(handler);
}

}