概述
观察者模式用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象做出反应。在观察者模式中,发生改变的对象成为观察目标,而被通知的对象成为观察者,一个观察目标可以对应多个观察者,而这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,是的系统更易于扩展。一个软件系统常常要求在某一个对象的状态发生变化的时候,其他对象做出相应的改变。观察者模式就是这种设计方案中最重要的一种
function Observers(){
this.arr = [];
}
Observers.prototype.through = function (name){
this.arr.push(name)
}
Observers.prototype.noThrough = function(name){
this.arr.splice(this.arr.findIndex(item=>item==name),1)
}
Observers.prototype.notice=function(){
this.arr.forEach(item => {
console.log(`${item}通过,你可以入职了`)
});
}
function Subject(){
this.observers = new Observers()
}
Subject.prototype.add=function(name){
this.observers.through(name)
}
Subject.prototype.delete = function (name){
this.observers.noThrough(name)
}
Subject.prototype.notify = function (){
this.observers.notice()
}
let subject = new Subject()
console.log(subject,'AAA')
subject.add('小明')
subject.add('小红')
subject.add('小黑')
subject.delete('小红')
subject.notify()
// 小明通过,你可以入职了
// 小黑通过,你可以入职了
观察者模式与发布订阅模式的区别
发布订阅模式
发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如果有的话)存在。
function Observers(){
this.arr = {}
}
Observers.prototype.on = function (name,stateFn){
if(!(name in this.arr)){
this.arr[name] = stateFn
}
}
Observers.prototype.emit = function(){
for(let key in this.arr){
this.arr[key]()
}
}
Observers.prototype.off = function(name){
Reflect.deleteProperty(this.arr,name)
}
let obervers = new Observers()
obervers.on('小明',function(){
console.log('小明通过面试')
})
obervers.on('小红',function(){
console.log('小红通过面试')
})
obervers.on('小黑',function(){
console.log('小黑没通过面试')
})
obervers.off('小红')
obervers.emit()
// 小明通过面试
// 小黑没通过面试