发布订阅者模式的理解和应用

2021-07-13  本文已影响0人  JX灬君

详解

ps:什么是设计模式
是设计思路,一定程度提高效率
在基础的23中设计模式中进行使用和优化和改良。

1.发布-订阅者模式定义

2.特征

3.发布订阅者模式的实现思路

案例讲解

  1. 去书店买书

案例分析

// 1.创建一个分析构造函数类
    // 包括4部分(消息队列,$on向消息队列里添加内容,$off删除消息队列里的内容,$emit触发消息队列里面的内容)
// 2.使用构造函数创建一个实例
// 3.使用实例,$on向消息队列里添加内容,$off删除消息队列里的内容,$emit触发消息队列里面的内容
/**
     * 分析构造函数
     * + 属性: 消息队列
     * {
     *  "click":[fn1, fn2, fn3],
     *  "abc":[fnA, fnB]
     * }
     * + 能向消息队列里面添加内容 $on
     * + 删除消息队列中的内容 $off
     * + 触发消息队列里面的内容 $emit
     */
    // 新建类
    class Observer {
      // 新建构造器
      constructor() {
        this.message = {}
      }
      // type 我拜托你要看着的某个行为
      // fn 行为发生之后应该做什么事情
      $on(type, fn) {
        // 先判断有没有这个属性
        // 如果没有这个属性,就初始化一个空的数组
        // 如果有这个属性,就往他的后面push一个新的fn
        // this.message[type] = fn
        if(!this.message[type]) {
          this.message[type] = []
        }
        this.message[type].push(fn)
      }
      $off(type, fn) {
        //判断有没有订阅
        if(!this.message[type]) return
        //判断有没有fn这个参数
        //如果没有fn,我就删掉整个事件
        if(!fn){
          this.message[type] = undefined
          return
          // 官方方法
          //delete this.message[type] 
        }
        //如果有fn我就仅仅只是过滤掉这个方法
        this.message[type] = this.message[type].filter((item) => item !== fn)
      }
      $emit(type) {
        //判断是否订阅
        if(!this.message[type]) return
        this.message[type].forEach(item => {
          item()
        })
      }
    }
    // 使用构造函数创建一个实例
    const person1 = new Observer() // 观察者

   
    // 向person1委托一些内容,帮忙观察
    person1.$on("abc", handlerA)
    person1.$on("abc", handlerB)

    
    // 整个消息队列全部删掉
    // person1.$off("abc")
    // 删掉部分消息队列
    // person1.$off("abc",handlerA)
    person1.$emit("abc")
    console.log(person1);

    // person1.$on("黑书", handlerA)
    // person1.$on("黑书", handlerB)

    // person1.$on("白书", handlerB)
    // person1.$on("白书", handlerC)


    function handlerA() {
      console.log("handlerA");
    }
    function handlerB() {
      console.log("handlerB");
    }
    function handlerC() {
      console.log("handlerC");
    }

知识点发散

设计模式有哪些

  1. 结构型模式
  1. 创建型模式
  1. 行为型模式
上一篇 下一篇

猜你喜欢

热点阅读