观察者模式

概述

观察者模式用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象做出反应。在观察者模式中,发生改变的对象成为观察目标,而被通知的对象成为观察者,一个观察目标可以对应多个观察者,而这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,是的系统更易于扩展。一个软件系统常常要求在某一个对象的状态发生变化的时候,其他对象做出相应的改变。观察者模式就是这种设计方案中最重要的一种

 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()
// 小明通过面试
// 小黑没通过面试
posted @ 2019-04-19 20:56  我会放电啪啪  阅读(194)  评论(0编辑  收藏  举报