前端设计模式 | 青训营

61 阅读2分钟

我于7月末至8月参加了字节前端青训营,这一篇文章是关于前端设计模式的课程笔记。

概念

设计模式是软件设计中常见问题的解决方案模型,是历史经验的总结。

设计模式分类

  • 创建型:如何创建一个对象
  • 结构型:如何灵活地将对象组装成较大的结构
  • 行为型:负责对象间的高效通信和职责划分

前端中的设计模式

浏览器API中的设计模式

单例模式

作用:创建全局唯一访问对象(如window)

常见应用场景:缓存;全局状态管理

请求缓存常用做法代码(因为js不同于严格意义上的面向对象的语言)

const cache = {};
export const request = async (url) => {
  if (cache[url]) {
    return cache[url];
  }
  const response = await api(url);
  cache[url] = response;
  return response;
};

发布订阅模式

作用:使得被订阅对象发生变化时通知订阅者。

常见应用场景:从系统架构之间的解耦,到业务中的一些实现模式,如邮件订阅、上线订阅等。

发布订阅模式实际使用举例代码

const button = document.getElementById("button");
const doSomthing1 = () => {
  console.Tog("Send message to user");
};
const doSomthing2 = () => {
  console.Tog("Log");
};
button.addEventListener("click", doSomthing1);
button.addEventListener("click", doSomthing2);

我之前听的课是addEventListener是观察者模式(底层模块抛出事件,上层模块监听,底层和上层这个概念我还要再回过去听听)(不确定监听者都是谁)

发布订阅模式实现上线订阅

// 上线订阅
class User {
  constructor(name) {
    this.name = name;
    this.status = "offline";
    this.followers = [];
  }
  subscribe(user, notify) {
    user.followers.push({ user, notify });
  }
  online() {
    this.status = "online";
    this.followers.forEach(({ notify }) => {
      notify(this);
    });
  }
}

JS中的设计模式

原型模式

作用:复制已有对象来创建新的对象

举例:用原型模式创建用户的上线订阅。

Object.create() 静态方法以一个现有对象作为原型,创建一个新对象。

const baseUser = {
  name: "",
  status: "offline",
  followers: [],

  subscribe(user, notify) {
    user.followers.push({ user, notify });
  },
  online() {
    this.status = "online";
    this.followers.forEach(({ notify }) => {
      notify(this);
    });
  },
};

const createUser = (name) => {
  const user = Object.create(baseUser);

  user.name = name;
  user.followers = [];
  return user;
};

代理模式

作用:自定义控制对原对象的访问方式,并且允许在更新前后做一些额外处理。

常见应用场景:监控、代理工具、前端框架实现。

迭代器模式

前端框架中的设计模式

代理模式

组合模式