-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathObserverPattern.ts
More file actions
55 lines (41 loc) · 1.42 KB
/
Copy pathObserverPattern.ts
File metadata and controls
55 lines (41 loc) · 1.42 KB
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
interface Subject {
attach(observer: Observer): void;
detach(observer: Observer): void;
notify(): void;
}
interface Observer {
update(subject: Subject): void;
}
class ConcreteSubject implements Subject {
public state: number;
private observers: Observer[] = [];
attach(observer: Observer): void {
const observerIsAttached = this.observers.includes(observer);
if (observerIsAttached) {
console.log(`Subject: The observer: ${observer} is attached already`);
}
this.observers.push(observer);
console.log(`Subject: The observer: ${observer} has been attached.`);
}
detach(observer: Observer): void {
const indexOfObserver = this.observers.indexOf(observer);
if (indexOfObserver == -1) {
console.log('Subject: The observer wasn\'t attached.');
}
this.observers.splice(indexOfObserver, 1);
console.log(`Subject: The observer: ${observer} has been detached.`);
}
notify(): void {
console.log('Notifing all observers about changes.');
for (const observer of this.observers) {
observer.update(this);
}
}
}
class ConcreteObserver implements Observer{
update(subject: Subject): void {
if (subject instanceof ConcreteSubject) {
console.log(`ConcreteObserver: Change occured in ${subject}. New state: ${subject.state}.`);
}
}
}