class Subject{
constructor(){
this.state = 0;
this.observers = [];
}
setState(state){
this.state = state;
this.notifyAllObservers();
}
getState(){
return this.state;
}
notifyAllObservers(){
this.observers.forEach(observer => {
observer.update()
})
}
attach(observer){
this.observers.push(observer)
}
}
class Observer{
constructor(name,subject){
this.name = name;
this.subject = subject;
this.subject.attach(this)
}
update(){
console.log(`${this.name} update , state ${this.subject.getState()}`);
}
}
let s = new Subject()
let o1 = new Observer('o1',s);
s.setState(1)
const EventEmitter = require('events').EventEmitter;
class Dog extends EventEmitter{
constructor(name){
super()//这个一定要写吗
this.name = name
}
}
let simon = new Dog('simon');
simon.on('bark',function(){
console.log(this.name,' brak')
})
setInterval(function(){
simon.emit('bark')
},1000)
nodeJS 的自定义事件是 js 观察者模式的一个应用场景
const fs = require('fs')
const readStream = fs.createReadStream('./data/file.txt')
let length = 0
readStream.on('data',function(chunk){
let len = chunk.toString().length
console.log('len ',len)
length += len
})
readStream.on('end',function(){
console.log('length',length)
})
nodeJS 的流的方式也是观察者模式中的一种实现的场景
on('data') 的意思是如果这个的文件一下子读取如果文件过大可能一下子就会拉满整个内存 使用的流的方式就是加了个水龙头他会一点一点的读取流的 直到 on('end') 其实这个流还有很多API 以后再去了解
const fs = require('fs')
const readLine = require('readline')
let rl = readLine.createInterface({
input:fs.createReadStream('./data/file.txt')
})
let lineNum = 0;
rl.on('line',function(line){
console.log('line ',line)
lineNum++;
})
rl.on('close',function(){
console.log('lineNum',lineNum)
})