zoukankan      html  css  js  c++  java
  • 观察者模式

    概述

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

     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()
    // 小明通过面试
    // 小黑没通过面试
    
  • 相关阅读:
    libevent中的bufferevent原理
    libevent中的事件机制
    libevent中数据缓冲区buffer分析
    libevent中最小堆实现算法解析
    我眼中的WebViewJavascriptBridge(图解)
    Tinyhttpd精读解析
    app微信支付的集成步骤
    java工厂模式的测试
    java Annotation 注解的使用
    android 连接蓝牙打印机 BluetoothAdapter
  • 原文地址:https://www.cnblogs.com/mengxiangji/p/10738734.html
Copyright © 2011-2022 走看看