美文网首页
观察者模式

观察者模式

作者: 小宇cool | 来源:发表于2020-11-02 21:19 被阅读0次

1. 观察者模式

1.1 定义

观察者模式(Observer): 又称发布订阅模式, 定义了一对多的关系, 让多个观察者对象同时监听某一个对象

当该对象发生变化时, 多个观察者对象也能做出对应相应的改变.

就比如你用手机定了一个早上8点的闹钟,此时你相当于订阅者, 手机相当于发布者,发布者此时会观察时间的变化当时间到了8点,手机就会发布消息, 提醒订阅者赶紧起床

1.2 作用

  1. 建立一套触发机制, 当一个对象的状态发生改变时, 所有依赖它的对象都会得到通知并自动更新.
  2. 将观察者和被被观察者进行解耦, 使它们都各自能独立变化,不会影响到另一边的变化.

1.3 应用场景

  • 场景一

事件绑定机制, 其实就是一个观察者模式, 事件触发的时候(发布消息)就执行对应的事件函数(订阅者)

let box = document.querySelector('.box');
function action(){
    console.log('事件被触发了')
}
box.addEventListener('click', action)

上面是一个非常简单事件绑定代码, 我们通过addEventListener给box元素绑定了一个点击事件以及对应的事件函数, 此时addEventListener相当于观察者, 对应的事件函数为订阅者, 当事件触发时, 观察者则就会发布消息,执行相应的事件函数.

  • 场景二

观察者模式的基本模式, 从简单的功能到复杂的实现

class Observer{
    constructor(){
        this.subscribes = []
    }
    // 订阅
    on(fn){
        this.subscribes.push(fn)
    }
    //发布 
    emit(msg){
        this.subscribes.forEach((v) => v(msg))
    }
}
let observer = new Observer()// 定义基础观察者对象
observer.on((msg) =>{
    console.log(111+msg);
})
observer.on(() => {
    console.log(222+"msg");
})
observer.trigger('dd')

上面的代码我们通过定义了一个Observer类, 并为其实例对象定义一个subscribes属性用来保存所有的订阅者, 通过on方法添加响应的订阅者, 然后通过emit方法来发布消息,并执行对应的订阅者的事件函数.

进阶版观察者

// 进阶版观察者
class Observer {
    constructor() {
        //储存订阅者
        this.subscribes = {}
    }
    //订阅
    on(name, callback) {
        // 如果不存在这个订阅者就添加这个订阅者
        if (!this.subscribes[name]) {
            this.subscribes[name] = [];
        }
        this.subscribes[name].push(callback)
    }
    // 发布
    emit(name, msg) {
        // 如果不存在这个订阅者就打断函数执行
        if (!this.subscribes[name])  throw new Error('未找到订阅者');;
        this.subscribes[name].forEach(fn => fn(msg))
    }
    //解绑
    off(name, callback) {
        let callbackList = this.subscribes[name];
        if (!callbackList) throw new Error('未找到订阅者');
        // 找出对应订阅者的事件函数并从删除
        let index = callbackList.indexOf(callback);
        if (index === 1) return
        else callbackList.splice(index, 1)
    }
}
let observer = new Observer();
console.log(observer)
function update1(msg){
    console.log(11,msg);
}
function update2(msg){
    console.log(22,msg);
}
function update3(msg) {
    console.log(33,msg);
}
observer.on('touch',update1)
observer.on('touch', update2)
observer.on('touch', update3)
observer.on('log', function(){
    console.log('log')
})
observer.off('touch', update1)

observer.emit('touch',"dd")
observer.emit('age')

我们可以在控制台打印出如下结果

image-20201102205150749.png

总结: 当一个对象的改变将导致多个对象导致改变时,而不知道具体有多少对象将发生改变, 使用观察者模式就非常合适, 可以降低对象之间的耦合度.

相关文章

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 前端面试考点之手写系列

    1、观察者模式 观察者模式(基于发布订阅模式) 有观察者,也有被观察者。 观察者需要放到被观察者列表中,被观察者的...

  • RxJava 原理篇

    一、框架思想 观察者模式观察者自下而上注入被观察者被观察者自上而下发射事件观察者模式 装饰器模式自上而下,被观察者...

  • 观察者模式

    观察者模式概念 观察者模式是对象的行为模式,又叫作发布-订阅(publish/subscrible)模式。 观察者...

  • 设计模式-观察者模式

    观察者模式介绍 观察者模式定义 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为...

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

  • iOS设计模式之观察者模式

    观察者模式 1、什么是观察者模式 观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模...

  • 观察者模式和发布订阅模式区别

    观察者模式 所谓观察者模式,其实就是为了实现松耦合(loosely coupled)。 在观察者模式中,观察者需要...

  • RxJava(二)

    一、观察者模式 1.1、传统的观察者模式 1.2、RxJava 的观察者模式 区别传统的观察者模式是一个 Obse...

网友评论

      本文标题:观察者模式

      本文链接:https://www.haomeiwen.com/subject/kzhvvktx.html