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()
    // 小明通过面试
    // 小黑没通过面试
    
  • 相关阅读:
    举例一个IO多路复用的C/S例子
    简单介绍协程
    生产者消费者模型
    多进程介绍
    有关多线程(同步锁,递归锁,同步对象,信号量)
    threading多线程模块
    开发一个支持多用户在线的FTP程序
    NTP时间服务器与客户端
    EF之增删改查
    返回新插入的数据的主键ID
  • 原文地址:https://www.cnblogs.com/mengxiangji/p/10738734.html
Copyright © 2011-2022 走看看