js设计模式(观察者模式,订阅发布模式)

本文详细介绍了观察者模式和发布订阅模式的概念及其应用场景。通过教室监控和云端通知的例子,展示了这两种模式的工作原理。观察者模式中,当被观察者(学生)的状态变化时,班主任和校长(观察者)会被触发执行相应操作。发布订阅模式则模拟了云端文件更新时,对关注用户的短信或邮件通知。两种模式都是事件驱动设计模式的实例,用于实现对象间的松耦合通信。
摘要由CSDN通过智能技术生成

观察者模式

/**
 * 观察者模式
 * 可以理解为监控,当被观察者的状态发生变化时,触发观察者的技能
 * 场景:教室
 * 观察者:班主任,校长->监控一个对象的状态,一旦状态发生,马上触发技能,需要有自己的属性和技能
 * 被观察者:学生->需要有自己的属性,状态和队列(都有谁观察自己)
 */

// 观察者
class Observer {
  constructor(name, fn = () => {}) {
    this.name = name;
    this.fn = fn;
  }
}

// 被观察者
class Subject {
  constructor(state) {
    this.state = state;
    this.observerList = [];
  }

  // 改变状态
  changeState(value) {
    this.state = value;
    this.observerList.forEach((item) => item.fn(this.state));
  }

  // 添加观察者
  addObserver(observer) {
    this.observerList.push(observer);
  }

  // 删除观察者
  deleteObserver(observer) {
    this.observerList = this.observerList.filter(item !== observer);
  }
}

// =========================
// 创建观察者
const xz = new Observer("校长", (state) => {
  console.log(`因为-${state}-把班主任叫来`);
});
const bzr = new Observer("班主任", (state) => {
  console.log(`因为-${state}-把你家长叫来`);
});

// 创建被观察者
const xm = new Subject("学习");
xm.addObserver(xz);
xm.addObserver(bzr);
xm.changeState("睡觉"); // 触发观察者行为

发布订阅模式

/**
 * 发布-订阅模式
 * 场景: 云端
 * 当有一个人往云端更新或者发布一个文件时,通知其他关注的用户(短信或邮件等)
 */

class Observer {
  constructor() {
    this.message = {};
  }
  // 添加消息
  on(type, fn) {
    if (!this.message[type]) {
      this.message[type] = [];
    }
    this.message[type].push(fn);
  }

  /**
   * 删除消息
   * @param {*} type 消息类型
   * @param {*} fn 事件处理函数
   */
  off(type, fn) {
    // 当fn不存在时删除该消息类型,否则删除该消息类型对应的事件处理函数
    if (!fn) {
      delete this.message[type];
    } else {
      this.message[type] = this.message[type].filter((item) => item !== fn);
    }
  }

  //触发消息
  trigger(type) {
    if (!this.message[type]) return;
    this.message[type].forEach((item) => item());
  }
}

// ============================

const person = new Observer();

person.on("a", handleA);
person.on("a", handleB);
person.on("c", handleC);

person.off("a", handleA);

person.trigger("a");

function handleA() {
  console.log("发短信通知");
}
function handleB() {
  console.log("发邮件通知");
}
function handleC() {
  console.log("其他方式通知");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值