|
22 | 22 | * [Iterator](#iterator)
|
23 | 23 | * [Mediator](#mediator)
|
24 | 24 | * [Memento](#memento)
|
| 25 | +* [Observer](#observer) |
25 | 26 |
|
26 | 27 |
|
27 | 28 |
|
@@ -881,5 +882,72 @@ board.printFormattedBoard();
|
881 | 882 |
|
882 | 883 | ```
|
883 | 884 |
|
| 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 | + |
884 | 952 |
|
885 | 953 |
|
0 commit comments