观察者模式 手斯HR

51 阅读1分钟

看的再多不如自己手写一次!!!!!

观察者模式 (三要素):

  • 由回调函数构成的订阅者数组
  • 用于添加和删除订阅者的addSubscriber方法与removeSubscriber方法
  • 用于接收并传递数据给订阅者 publish方法
    class Observer {
        constructor() {
          //由回调函数构成的订阅者数组
          this.subscriber = [];
        }

        // 订阅者的方法
        addSubscriber(callback) {
          if (typeof callback === "function") {
            this.subscriber.push(callback);
          }
        }

        // 删除订阅者方法
        removeSubscriber(callback) {
          if (typeof callback === "function") {
            this.subscriber = this.subscriber.filter((sub) => sub !== callback);
          }
        }

        // 用于接收并传递数据给订阅者方法
        publish(data) {
          this.subscriber.forEach((sub) => {
            if (typeof sub === "function") {
              sub(data);
            }
          });
        }
      }

如何变为了一个发布者

    // 这样可以轻松实现 任意对象变成一个Observer 
      class Logger extends Observer {
        writePost(content) {
          this.publish(content);
        }
      }
      // 实例化
      const logger = new Logger(); // 此时logger这个实例对象原型上就有了observer中的所有方法

接下来我们就可以实际使用

// 订阅方
const tom = {
    read(data) {
      console.log('tom订阅者 接收到的消息:', data);
    }
}
// 订阅方
const lilei = {
    read(data) {
      console.log('lilei订阅者 接收到的消息:', data);
    }
}

logger.addSubscriber(tom.read)
logger.addSubscriber(lilei.read)

// 推送消息方
logger.writePost('早点起床!') // 广播会给所有订阅者发送此消息

结果为:

image.png

// 删除一个订阅
logger.removeSubscriber(tom.read)
logger.writePost('下班了!') // // 广播会给所有订阅者发送此消息

// 结果为:

image.png

至此结束! 自己不写写永远无法体会!!!