Skip to content

Commit c019963

Browse files
committed
add observer design pattern
Signed-off-by: Nimit <nimitagg95@gmail.com>
1 parent 1f0f996 commit c019963

File tree

3 files changed

+131
-0
lines changed

3 files changed

+131
-0
lines changed

Behavioral/observer.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
const fs = require('fs');
2+
// Manages a Subject interactions with observer
3+
class SubjectManager {
4+
constructor() {
5+
this._observers = {};
6+
}
7+
addObserver(eventType, observer) {
8+
if(!this._observers[eventType]) {
9+
this._observers[eventType] = [];
10+
}
11+
this._observers[eventType].push(observer);
12+
}
13+
removeObserver(eventType, observer) {
14+
const idx = this._observers[eventType].indexOf(observer);
15+
if(idx > -1){
16+
this._observers[eventType].splice(idx);
17+
}
18+
}
19+
notify(eventType, data) {
20+
this._observers[eventType].forEach(observer => observer.update(data));
21+
}
22+
}
23+
24+
class FileManager {
25+
constructor() {
26+
this.subjectManager = new SubjectManager();
27+
}
28+
monitorFile(path) {
29+
// eslint-disable-next-line node/no-unsupported-features/es-syntax
30+
fs.watch(path, (data) => this.subjectManager.notify("change", {path, data}));
31+
}
32+
addObserver(eventType, observer) {
33+
this.subjectManager.addObserver(eventType, observer);
34+
}
35+
removeObserver(eventType, observer) {
36+
this.subjectManager.removeObserver(eventType, observer);
37+
}
38+
}
39+
class LoggingObserver {
40+
update({ data }) {
41+
console.log(data);
42+
}
43+
}
44+
class SizeChangeObserver {
45+
constructor() {
46+
this.size = 0;
47+
}
48+
update({ path }) {
49+
const newSize = fs.statSync(path).size;
50+
if(newSize > this.size) {
51+
console.log("size increase to " + newSize);
52+
this.size = newSize;
53+
}
54+
}
55+
}
56+
57+
// Subject class
58+
const fileManager = new FileManager();
59+
// Adding observers
60+
fileManager.addObserver("change", new LoggingObserver());
61+
fileManager.addObserver("change", new SizeChangeObserver());
62+
fileManager.monitorFile(process.argv[1]);

buildDocs.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const sections = [
3535
{ name: 'iterator', path: './Behavioral' },
3636
{ name: 'mediator', path: './Behavioral' },
3737
{ name: 'memento', path: './Behavioral' },
38+
{ name: 'observer', path: './Behavioral' },
3839
]
3940
}
4041
];

docs.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
* [Iterator](#iterator)
2323
* [Mediator](#mediator)
2424
* [Memento](#memento)
25+
* [Observer](#observer)
2526

2627

2728

@@ -881,5 +882,72 @@ board.printFormattedBoard();
881882

882883
```
883884

885+
### Observer
886+
##### observer.js
887+
```Javascript
888+
const fs = require('fs');
889+
// Manages a Subject interactions with observer
890+
class SubjectManager {
891+
constructor() {
892+
this._observers = {};
893+
}
894+
addObserver(eventType, observer) {
895+
if(!this._observers[eventType]) {
896+
this._observers[eventType] = [];
897+
}
898+
this._observers[eventType].push(observer);
899+
}
900+
removeObserver(eventType, observer) {
901+
const idx = this._observers[eventType].indexOf(observer);
902+
if(idx > -1){
903+
this._observers[eventType].splice(idx);
904+
}
905+
}
906+
notify(eventType, data) {
907+
this._observers[eventType].forEach(observer => observer.update(data));
908+
}
909+
}
910+
911+
class FileManager {
912+
constructor() {
913+
this.subjectManager = new SubjectManager();
914+
}
915+
monitorFile(path) {
916+
// eslint-disable-next-line node/no-unsupported-features/es-syntax
917+
fs.watch(path, (data) => this.subjectManager.notify("change", {path, data}));
918+
}
919+
addObserver(eventType, observer) {
920+
this.subjectManager.addObserver(eventType, observer);
921+
}
922+
removeObserver(eventType, observer) {
923+
this.subjectManager.removeObserver(eventType, observer);
924+
}
925+
}
926+
class LoggingObserver {
927+
update({ data }) {
928+
console.log(data);
929+
}
930+
}
931+
class SizeChangeObserver {
932+
constructor() {
933+
this.size = 0;
934+
}
935+
update({ path }) {
936+
const newSize = fs.statSync(path).size;
937+
if(newSize > this.size) {
938+
console.log("size increase to " + newSize);
939+
this.size = newSize;
940+
}
941+
}
942+
}
943+
944+
// Subject class
945+
const fileManager = new FileManager();
946+
// Adding observers
947+
fileManager.addObserver("change", new LoggingObserver());
948+
fileManager.addObserver("change", new SizeChangeObserver());
949+
fileManager.monitorFile(process.argv[1]);
950+
```
951+
884952

885953

0 commit comments

Comments
 (0)