• 观察者模式 & 发布-订阅模式(设计模式与开发实践 P8)


    观察者模式

    定义:他用来定义对象之间一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖他的对象都会得到通知

    运用

    如果我们使用过 DOM 上的事件函数,那就接触过观察者模式

    document.body.addEventListener(
      "click",
      function () {
        console.log("body clicked");
      },
      false
    );
    
    document.body.click(); // 输出:body clicked
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这段代码中 body 上添加了一个订阅者,而 document.body.click() 向所有订阅者发送了点击事件~

    我们可以随意添加 订阅者 而不会影响 发布者 代码的编写

    实现

    接下来尝试实现一些自定义事件,通过 listen 监听某个名为 key 的事件,通过 trigger 执行事件回调函数

    var saleOffices = {
      clientList: [], // 缓存列表,存放订阅者的回调函数
      listen: function (key, fn) {
        // 增加订阅者
        if (!this.clientList[key]) {
          // 如果还没有订阅过此类消息,给该类消息创建一个缓存列表
          this.clientList[key] = []; // 直接把函数推入数组
        }
        this.clientList[key].push(fn); // 订阅的消息添加进缓存列表
      },
      trigger: function () {
        // 发布消息
        var key = Array.prototype.shift.call(arguments); // 取出消息类型
        var fns = this.clientList[key]; // 取出该消息对应的回调函数集合
        if (!fns || fns.length === 0) {
          // 如果没有订阅该消息,则返回
          return false;
        }
        for (var i = 0, fn; (fn = fns[i++]); ) {
          // 依次执行订阅的回调函数
          fn.apply(this, arguments); // arguments 是发布消息时带上的参数
        }
      },
    };
    
    // ----- 测试 -----
    saleOffices.listen("squareMeter88", function (price) {
      // 小明订阅消息
      console.log("小明得到价格= " + price);
    });
    
    saleOffices.listen("squareMeter100", function (price) {
      // 小红订阅消息
      console.log("小红价格= " + price);
    });
    
    saleOffices.trigger("squareMeter88", 2000000); // 输出:2000000
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    Kafka - 08 Kafka Broker工作流程 | 节点服役 | 节点退役
    鸿蒙开发之ArkTS 基础九 枚举类型
    定语从句------六级
    Vue知识系列(3)每天10个小知识点
    安利几个小妙招教你如何快速翻译PDF文件
    初识进程以及父子进程
    2.7 PE结构:重定位表详细解析
    RuntimeError: Error compiling objects for extension手把手带你解决(超详细)
    使用C语言实现双向链表(带头结点)
    go-zero 是如何做路由管理的?
  • 原文地址:https://blog.csdn.net/Littlelumos/article/details/132919939