8种常见的设计模式,前端怎么用

196 阅读3分钟

8种常见的设计模式,前端怎么用。 设计模式很抽象,但是云哥通俗易懂的讲下,一下就懂了,很多时候你写的代码里就用到了只是你不知道。

1. 单例模式 (Singleton Pattern)

说明:确保一个类仅有一个实例,并提供一个访问它的全局访问点

生活比喻:一个公司只能有一个总经理,管理全局事务

前端场景

  • 全局状态管理(Vuex/Pinia store)

  • 全局弹窗管理(Message、Loading)

// 全局弹窗管理,就像公司只有一个总经理一样
const createMessage = () => {
  let instance = null;
  return {
    getInstance() {
      if (!instance) {
        instance = { show: (msg) => console.log(msg) };
      }
      return instance;
    }
  };
};

2. 策略模式 (Strategy Pattern)

说明:定义一系列算法,把它们封装起来,并且使它们可以互相替换

生活比喻:出门可以选择不同交通工具:步行、单车、开车,目的相同但方式不同

前端场景

  • 表单验证规则

  • 排序方式切换

 // 不同的排序策略,就像选择不同的交通工具

    const sortStrategies = {

      price(a, b) => a.price - b.price,

      name(a, b) => a.name.localeCompare(b.name)

    };

3. 观察者模式 (Observer Pattern

说明:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知

生活比喻:订阅公众号,有新文章时会通知所有关注者

前端场景

  • 事件总线(EventBus)

  • 组件通信

// 就像公众号的订阅和推送
const eventBus = {
  subscribers: {},
  subscribe(event, fn) { /*...*/ },
  publish(event, data) { /*...*/ }
};

4. 工厂模式 (Factory Pattern)

说明:提供一个创建对象的接口,让子类决定实例化哪个类

生活比喻:肯德基的点餐,不需要知道厨房如何制作,只需点餐

前端场景

  • 组件动态创建

  • 表单控件生成

// 就像点餐一样,只需说要什么,不需要知道制作过程
const createButton = (type) => ({
  primary: { class: 'btn-primary' },
  danger: { class: 'btn-danger' }
}[type]);

5. 装饰器模式 (Decorator Pattern)

说明:动态地给对象添加一些额外的职责

生活比喻:手机壳,不改变手机功能,但提供保护等额外功能

前端场景

  • 路由守卫

  • 接口请求拦截

// 就像给手机套保护壳,增加新功能但不改变原有功能
const withLog = (fn) => {
  return (...args) => {
    console.log('调用前');
    const result = fn(...args);
    console.log('调用后');
    return result;
  };
};

6. 适配器模式 (Adapter Pattern)

说明:将一个类的接口转换成客户希望的另外一个接口

生活比喻:旅行转换插头,让不同标准的插座能够通用

前端场景

  • 后端数据格式转换

  • 第三方库接口适配

// 就像转换插头,将一种格式转换为另一种格式
const apiAdapter = {
  format: (data) => ({
    name: data.userName,
    age: data.userAge
  })
};

7. 代理模式 (Proxy Pattern)

说明:为其他对象提供一种代理以控制对这个对象的访问

生活比喻:明星经纪人,不直接接触明星而是通过经纪人沟通

前端场景

  • 图片懒加载

  • 接口数据缓存

// 就像经纪人代理明星一样,控制对资源的访问
const createImgProxy = (targetImg) => {
  const img = new Image();
  img.onload = () => targetImg.src = img.src;
  return {
    setSrc(src) { img.src = src; }
  };
};

8. 命令模式 (Command Pattern)

说明:将一个请求封装成一个对象,使你可以用不同的请求对客户进行参数化

生活比喻:餐厅点菜单,服务员记录顾客需求传递给厨房

前端场景

  • 撤销重做功能

  • 任务队列管理

// 就像餐厅的点单系统,将请求封装成命令对象
const actions = {
  add: {
    execute: (x) => x + 1,
    undo: (x) => x - 1
  }
};

海云前端 提供一对一简历面试辅导 前端私教课 项目难点笔记 语音咨询 模拟面试