观察者模式与发布-订阅模式

Posted X可乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式与发布-订阅模式相关的知识,希望对你有一定的参考价值。

相关设计模式

  • 设计模式(design pattern)是针对软件设计中普遍存在的各种问题所提出的解决方案
    • 观察者模式
    • 发布-订阅模式

观察者模式

  • 观察者模式(Observer pattern)指的是在对象间定义一个一对多(被观察者与多个观察者)的关联,当一个对象改变了状态,所有其他相关的对象会被通知并且自动刷新
  • 核心概念:
    • 观察者 Observer
    • 被观察者(观察目标)Subject
  • 在实际生活中,我在办公室内坐着,我们几位同事在看着我的水杯,这时,我和我的同事属于观察者,我的水杯属于被观察者(观察目标)
  • 这时水杯掉落在地上摔碎了,也就是一个对象改变了状态
  • 我去躲在了门后,我的同事A躲在了桌子下边,我的同事C跑去叫人了,也就是观察者做出了响应
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 被观察者(观察目标)
        // 1. 添加观察者
        // 2. 通知所有观察者
        class Subject 
            constructor () 
                // 存储所有观察者
                this.observers = []
            

            // 添加观察者功能
            addObserver (observer) 
                // 检测传入的参数是否为 观察者 实例
                if (observer && observer.upDate) 
                    this.observers.push(observer)
                
            

            // 通知所有观察者
            notify () 
                // 调用观察者列表中的每个观察者的更新方法
                this.observers.forEach(observer => 
                    observer.upDate()
                );
            
        

        // 观察者
        // 1. 当观察目标发生状态变化时,进行 “更新”
        class Observer 
            upDate () 
                console.log("事件发生了,进行了相应的处理")
            
        

        // 功能测试
        const subject = new Subject()
        const ob1 = new Observer()
        const ob2 = new Observer()

        // 将观察者添加给要观察的观察目标
        subject.addObserver(ob1)
        subject.addObserver(ob2)

        // 通知观察者,进行操作(某些具体的场景下)
        subject.notify()

    </script>
</body>
</html>

发布-订阅模式

  • 发布-订阅模式(Publish-subscribe pattern)可认为是观察者模式解耦的进阶版本
    • 在发布者与订阅者之间添加消息中心,所有的消息均通过消息中心管理,而发布者与订阅者不会直接联系,实现了两者的解耦
  • 核心概念:
    • 消息中心 Dep
    • 订阅者 Subscriber
    • 发布者 Publisher
  • 在实际生活中,一家超市要做活动宣传自己即将开业,这时这家超市就属于发布者
  • 然后超市找到了广告团队,让他们去发布广告,宣传自己的开业日期开业活动等等,这时这件广告团队就属于消息中心
  • 最后广告团队通过发传单或者在电视发布广告等方式,通知消费者,然后消费者做出响应,比如在开业当天去购物等,这时消费者就属于订阅者
  • 最常见的为 vue 组件传参中的 eventBus
// 创建一个 Vue 实例(消息中心)
const eventBus = new Vue()

// 注册事件(设置订阅者)
eventBus.$on('datachange', () => 
    console.log('事件处理功能1')
)
eventBus.$on('datachange', () => 
    console.log('事件处理功能2')
)

// 触发事件(设置发布者)
eventBus.$emit('datachange')
  • vue 的设计模式也是利用了发布-订阅模式
  • 详细文章请点击跳转:文章地址

以上是关于观察者模式与发布-订阅模式的主要内容,如果未能解决你的问题,请参考以下文章

观察者模式与发布订阅模式的区别

观察者模式与发布-订阅模式

观察者模式与发布订阅模式(简易版)

[设计模式]观察者模式与订阅模式

Java实现观察者(发布-订阅)模式

设计模式 - 发布-订阅者模式