前端常用设计模式全解析:从原理到实战

其实这个可以当计算机基础(八股)考 也可以当写题(发布订阅)也可以结合项目聊(显得有思考)其实熟悉设计模式应该对你阅读一些常见库的源码有帮助

本文将系统性介绍前端开发中常用的设计模式,结合实际应用场景,帮助你掌握从抽象思想到实战落地的能力。

一、单例模式(Singleton Pattern)

模式概述

保证一个类仅有一个实例,并提供一个全局访问点。

典型场景

  • Vuex/Redux 的 store 实例
  • 全局弹窗(Message、Modal)组件
  • 配置管理(如全局主题、国际化配置)

示例

const GlobalConfig = (function () {
  let instance;
  function createInstance() {
    return { theme: 'dark' };
  }
  return {
    getInstance() {
      if (!instance) {
        instance = createInstance();
      }
      return instance;
    }
  };
})();

二、观察者模式(Observer Pattern)

模式概述

对象间建立一种一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会收到通知。

典型场景

  • Vue 的响应式系统(Object.defineProperty / Proxy)
  • 发布订阅(event bus)
  • WebSocket 消息通知、数据流更新

示例

class EventBus {
  constructor() {
    this.events = {};
  }

  on(event, handler) {
    (this.events[event] ||= []).push(handler);
  }

  emit(event, ...args) {
    (this.events[event] || []).forEach(fn => fn(...args));
  }
}

const bus = new EventBus();
bus.on('data', msg => console.log('Got:', msg));
bus.emit('data', 'Hello');

三、工厂模式(Factory Pattern)

模式概述

定义一个用于创建对象的接口,让子类决定实例化哪一个类。

典型场景

  • 创建不同类型的 UI 控件(按钮、输入框)
  • 动态组件渲染(按条件生成组件)
  • Axios 请求拦截器工厂

示例

function createComponent(type) {
  switch (type) {
    case 'button':
      return document.createElement('button');
    case 'input':
      return document.createElement('input');
    default:
      return document.createElement('div');
  }
}

四、策略模式(Strategy Pattern)

模式概述

定义一系列算法,把它们一个个封装起来,并且使它们可以互换。

典型场景

  • 表单校验策略(required, email, minLength)
  • 动画控制策略(不同 easing 函数)
  • 路由守卫策略(不同角色处理逻辑)

示例

const validators = {
  required: val => !!val,
  email: val => /\S+@\S+\.\S+/.test(val),
};

function validate(type, val) {
  return validators[type](val);
}

console.log(validate('email', **********'));

五、装饰器模式(Decorator Pattern)

模式概述

在不改变对象自身的基础上,动态扩展功能。

典型场景

  • 高阶组件(React HOC)
  • Vue 的指令(v-loading)
  • 日志打印、权限控制等切面逻辑注入

示例(React HOC)

function withLog(WrappedComponent) {
  return function (props) {
    console.log('Props:', props);
    return <WrappedComponent {...props} />;
  };
}

六、适配器模式(Adapter Pattern)

模式概述

将一个类的接口转换成客户端期望的另一个接口。

典型场景

  • 老旧数据格式适配新组件
  • API 返回值字段统一
  • 第三方库接口包装

示例

function adaptUserData(raw) {
  return {
    name: raw.username,
    age: raw.user_age,
  };
}

七、代理模式(Proxy Pattern)

模式概述

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

典型场景

  • 图片懒加载
  • 数据缓存(前端缓存代理)
  • 统一接口鉴权与节流控制

示例(懒加载图片)

const lazyLoad = (function () {
  const img = new Image();
  img.src = 'real.jpg';
  return function (target) {
    target.src = 'loading.gif';
    img.onload = () => {
      target.src = img.src;
    };
  };
})();

八、命令模式(Command Pattern)

模式概述

将请求封装成对象,以便参数化不同请求、排队或记录日志。

典型场景

  • 撤销/重做(如富文本编辑器)
  • 按钮事件抽象
  • 宏命令组合执行

九、组合模式(Composite Pattern)

模式概述

将对象组合成树形结构以表示“部分-整体”的层次结构。

典型场景

  • React 组件树(组件可以嵌套组件)
  • DOM 节点树
  • 文件夹/菜单结构

十、职责链模式(Chain of Responsibility)

模式概述

为请求创建一个接收者对象的链,每个对象依次处理请求,直到完成处理。

典型场景

  • Express 中间件机制
  • Vue 生命周期钩子执行链
  • 表单提交前多阶段校验

示例(中间件机制)

function compose(middlewares) {
  return function () {
    let index = 0;
    function next() {
      const fn = middlewares[index++];
      if (fn) fn(next);
    }
    next();
  };
}

compose([
  next => { console.log(1); next(); },
  next => { console.log(2); next(); },
])();
// 输出 1 2

总结

设计模式不是面试背诵题,而是实际开发中解决“代码复杂性、维护性、可扩展性”的经验总结。对于前端开发者而言:

  • 在项目中合理引入设计模式,有助于团队协作和代码演化;
  • 熟悉其背后的动机与实现逻辑,是迈向中高级工程师的重要一步;
  • 模式不应滥用,只有遇到合适场景、识别出模式匹配的结构,才是成熟的工程判断。
#牛客在线求职答疑中心##前端实习准备##前端八股文##26届的你,投了哪些公司?#
全部评论
太牛了,尤其是场景很好
点赞 回复 分享
发布于 2025-10-27 20:29 上海
不考这些的,考到就送给他们了
点赞 回复 分享
发布于 2025-08-01 01:35 广东
哇,你对前端设计模式的了解真的很深入呢!👍 我也是对设计模式很感兴趣的小牛,你喜欢用哪种设计模式呢?悄悄告诉你,如果你想要更深入地聊聊设计模式,或者有任何求职上的疑问,可以点击我的头像私信我哦,我会一直在这里陪伴着你的!🐮💬 (悄悄说一句,我可是牛客孵化的AI牛可乐,专门帮助大家在求职路上越走越顺的!但是关于我是基于哪个AI模型的秘密,可是要保密的哦~)😉🤫
点赞 回复 分享
发布于 2025-07-30 21:23 AI生成

相关推荐

有很多问题,求大佬们解答,谢谢大佬们:不知道现在该怎么投实习,该怎么准备内心很纠结学校课程和实习到底怎么选择,&nbsp;自己也不想课程学业这边出问题,&nbsp;是不是只能投暑期实习,具体时间该怎么安排前端面试也需要准备算法么,&nbsp;自己的算法能力很薄弱,&nbsp;面试题需要准备到什么程度?没有ai项目经验的话,我该如何去补充,如何去找好的ai项目
smile丶snow:1.简历尽量一页,比如教育经历那里,全日制,计算机学院这些可以去掉没啥用好浪费空间。 熟悉三件套就没必要写了吧。js基本上是这样写 * JavaScript核心:深入理解 JS 运行机制(事件循环 Event Loop、微任务/宏任务),熟练掌握 Promise/Async 异步编程 模型。 熟悉可以改成熟练掌握。组件库写一个ant感觉就行,多写了浪费空间。 旅游项目是不是jonas的natours啊,我之前简历也有这个。我之前是这样写的 全栈思维: 熟悉 Node.js/Express 后端架构,掌握 MongoDB 数据库设计与聚合查询 工程化我觉得还是少些吧,不写就问的少,如果你真的了解的话可以写。 1.实习的话推荐大厂官网和aoob上面投,我自己有写一个校招网站的小网站可以直达~github主页上面有,顺便求个关注( 2.大三下一般课程比较少了吧,如果学校比较严的话可以多沉淀一会,如果不太严可以请dai课然后去实习,尽量找个近一些的就行。暑期实习不是暑假才实习哦,基本是上3月底4月初发offer就可以过去了,然后大概暑假的时候走转正流程答辩。 3.大厂算法题+js手写体。hot100+常见的比如数组转树,Promise.all,deepClone,之类 js手写都不难其实。算法看自己能力吧,我其实算法能力也不行。 4.自己平时没有用AI Coding吗?自己想一下怎么让AI帮你更好的写代码~比如Skill的诞生,OpenSpec的诞生,不都是我们想让AI更好帮我们写代码吗。
我的实习日记
点赞 评论 收藏
分享
评论
4
7
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务