前端常见设计模式深度解析

# 前端常见设计模式深度解析

一、设计模式概述

设计模式是解决特定问题的经验总结,前端开发中常用的设计模式可分为三大类:

  1. 创建型模式:处理对象创建机制(单例、工厂等)
  2. 结构型模式:处理对象组合(装饰器、适配器等)
  3. 行为型模式:处理对象间通信(观察者、策略等)

二、核心设计模式详解

1. 单例模式(Singleton)

现代实现方案
const Singleton = (() => {let instance;function createInstance() {return {data: [],add(item) {this.data.push(item);},get() {return [...this.data];}};}return {getInstance() {if (!instance) {instance = createInstance();}return instance;}};
})();// 使用示例
const store1 = Singleton.getInstance();
const store2 = Singleton.getInstance();
console.log(store1 === store2); // true#### 应用场景
- Redux/Vuex的store管理
- 全局缓存对象
- 浏览器全局对象(如window)### 2. 观察者模式(Observer)
#### 增强版实现
```javascript
class EventBus {constructor() {this.events = new Map();}on(event, callback, once = false) {if (!this.events.has(event)) {this.events.set(event, new Set());}this.events.get(event).add({ callback, once });}once(event, callback) {this.on(event, callback, true);}emit(event, ...args) {if (!this.events.has(event)) return;const handlers = this.events.get(event);handlers.forEach(handler => {handler.callback(...args);if (handler.once) {this.off(event, handler.callback);}});}off(event, callback) {if (!this.events.has(event)) return;const handlers = this.events.get(event);for (let handler of handlers) {if (handler.callback === callback) {handlers.delete(handler);break;}}}
}// 使用示例
const bus = new EventBus();
bus.on('login', user => console.log(`User ${user.name} logged in`));
bus.emit('login', { name: 'Alice' });
实际应用
  • Vue的EventBus
  • DOM事件系统
  • WebSocket消息处理

3. 工厂模式(Factory)

现代变体
interface Product {operation(): string;
}class ConcreteProductA implements Product {operation() {return 'Product A';}
}class ConcreteProductB implements Product {operation() {return 'Product B';}
}class ProductFactory {static createProduct(type: 'A' | 'B'): Product {switch (type) {case 'A': return new ConcreteProductA();case 'B': return new ConcreteProductB();default: throw new Error('Invalid product type');}}
}// 使用示例
const product = ProductFactory.createProduct('A');
console.log(product.operation()); // "Product A"
应用场景
  • UI组件库(Button、Modal等)
  • 不同环境配置(开发/生产)
  • API客户端(REST/GraphQL切换)

三、其他重要设计模式

1. 策略模式(Strategy)

const strategies = {add: (a, b) => a + b,subtract: (a, b) => a - b,multiply: (a, b) => a * b
};class Calculator {execute(strategy, a, b) {return strategies[strategy]?.(a, b) ?? NaN;}
}// 使用示例
const calc = new Calculator();
console.log(calc.execute('add', 5, 3)); // 8

2. 装饰器模式(Decorator)

function withLogging(fn) {return function(...args) {console.log(`Calling ${fn.name} with`, args);const result = fn.apply(this, args);console.log(`Result:`, result);return result;};
}// 使用示例
const add = withLogging((a, b) => a + b);
add(2, 3);
// 输出:
// Calling add with [2, 3]
// Result: 5

3. 代理模式(Proxy)

const apiProxy = new Proxy({}, {get(target, endpoint) {return async (params) => {console.log(`Calling API: /${endpoint}`);const res = await fetch(`https://api.example.com/${endpoint}`, {method: 'POST',body: JSON.stringify(params)});return res.json();};}
});// 使用示例
const data = await apiProxy.users({ page: 1 });

四、设计模式在前端框架中的应用

设计模式React应用场景Vue应用场景
观察者模式Context APIEventBus
策略模式Hooks自定义逻辑组件方法
装饰器模式HOC高阶组件装饰器语法
代理模式ForwardRef计算属性
工厂模式createElement组件工厂

五、设计模式选择指南

  1. 何时使用单例模式

    • 需要全局唯一状态时
    • 频繁访问的共享资源
    • 避免重复初始化开销
  2. 何时使用观察者模式

    • 组件间松耦合通信
    • 实时数据更新场景
    • 跨层级组件交互
  3. 何时使用工厂模式

    • 创建过程复杂时
    • 需要根据不同条件创建不同实例
    • 需要隐藏创建细节

六、性能与注意事项

  1. 单例模式

    • 注意内存泄漏问题
    • 考虑线程安全(在Web Worker场景)
  2. 观察者模式

    • 及时取消订阅
    • 避免过度通知导致的性能问题
  3. 工厂模式

    • 不要过度设计简单对象创建
    • 考虑与依赖注入结合使用

七、现代JavaScript中的新模式

  1. 组合模式(Composition)
const canFly = {fly() {console.log('Flying!');}
};const canSwim = {swim() {console.log('Swimming!');}
};function createFlyingFish() {return Object.assign({}, canFly, canSwim);
}
  1. 模块模式(Module)
// ES Modules
export const api = {get() { /* ... */ },post() { /* ... */ }
};// 或使用IIFE
const counter = (() => {let count = 0;return {increment() { count++ },get() { return count }};
})();

掌握这些设计模式能显著提升代码质量,建议在实际项目中:

  1. 从简单模式开始应用
  2. 逐步尝试复杂模式组合
  3. 根据项目规模选择适当模式
  4. 避免过度设计简单场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87638.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React 学习(3)

核心API——React.creatElement()方法优点:将创建元素、添加属性和事件、添加内容和子元素等使用原生dom需要进行复杂操作才能实现的功能集成在一个API中。1.该方法接收三个参数第一个是要创建的元素的名称(小写是因为如果,大写开头会被react…

倾斜摄影无人机飞行航线规划流程详解

在倾斜摄影测量项目中,航线规划的严谨性直接决定了最终三维模型的质量与完整性。照片覆盖不全、模型空洞、纹理模糊或分辨率不达标等问题,往往源于规划阶段对关键细节的疏忽。本文将系统梳理倾斜摄影无人机航线规划的核心流程与关键要点,旨在…

Minio大文件分片上传

一、引入依赖 <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.3</version></dependency> 二、自定义Minio客户端 package com.gstanzer.video.controller;import com.google.common.c…

Jenkins 插件深度应用:让你的CI/CD流水线如虎添翼 [特殊字符]

Jenkins 插件深度应用&#xff1a;让你的CI/CD流水线如虎添翼 &#x1f680; 嘿&#xff0c;各位开发小伙伴&#xff01;今天咱们来聊聊Jenkins的插件生态系统。如果说Jenkins是一台强大的引擎&#xff0c;那插件就是让这台引擎发挥最大威力的各种零部件。准备好了吗&#xff1…

密码学(斯坦福)

密码学笔记 \huge{密码学笔记} 密码学笔记 斯坦福大学密码学的课程笔记 课程网址&#xff1a;https://www.bilibili.com/video/BV1Rf421o79E/?spm_id_from333.337.search-card.all.click&vd_source5cc05a038b81f6faca188e7cf00484f6 概述 密码学的使用背景 安全信息保护…

代码随想录算法训练营第四十六天|动态规划part13

647. 回文子串 题目链接&#xff1a;647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 思路&#xff1a; 以dp【i】表示以s【i】结尾的回文子串的个数&#xff0c;发现递推公式推导不出来此路不通 以dp【i】【j】表示s【i】到s【j】的回…

基于四种机器学习算法的球队数据分析预测系统的设计与实现

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍项目展示随机森林模型XGBoost模型逻辑回归模型catboost模型每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本项目旨在设计与实现…

http、SSL、TLS、https、证书

一、基础概念 1.HTTP HTTP (超文本传输协议) 是一种用于客户端和服务器之间传输超媒体文档的应用层协议&#xff0c;是万维网的基础。 简而言之&#xff1a;一种获取和发送信息的标准协议 2.SSL 安全套接字层&#xff08;SSL&#xff09;是一种通信协议或一组规则&#xf…

在 C++ 中,判断 `std::string` 是否为空字符串

在 C 中&#xff0c;判断 std::string 是否为空字符串有多种方法&#xff0c;以下是最常用的几种方式及其区别&#xff1a; 1. 使用 empty() 方法&#xff08;推荐&#xff09; #include <string>std::string s; if (s.empty()) {// s 是空字符串 }特性&#xff1a; 时间…

【Harmony】鸿蒙企业应用详解

【HarmonyOS】鸿蒙企业应用详解 一、前言 1、应用类型定义速览&#xff1a; HarmonyOS目前针对应用分为三种类型&#xff1a;普通应用&#xff0c;游戏应用&#xff0c;企业应用。 而企业应用又分为&#xff0c;企业普通应用和设备管理应用MDM&#xff08;Mobile Device Man…

Linux云计算基础篇(8)

VIM 高级特性插入模式按 i 进入插入模式。按 o 在当前行下方插入空行并进入插入模式。按 O 在当前行上方插入空行并进入插入模式。命令模式:set nu 显示行号。:set nonu 取消显示行号。:100 光标跳转到第 100 行。G 光标跳转到文件最后一行。gg 光标跳转到文件第一行。30G 跳转…

Linux进程单例模式运行

Linux进程单例模式运行 #include <iostream> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int write_pid(const cha…

【Web 后端】部署服务到服务器

文章目录 前言一、如何启动服务二、挂载和开机启动服务1. 配置systemctl 服务2. 创建server用户3. 启动服务 总结 前言 如果你的后端服务写好了如果部署到你的服务器呢&#xff0c;本次通过fastapi写的服务实例&#xff0c;示范如何部署到服务器&#xff0c;并做服务管理。 一…

国产MCU学习Day5——CW32F030C8T6:窗口看门狗功能全解析

每日更新教程&#xff0c;评论区答疑解惑&#xff0c;小白也能变大神&#xff01;" 目录 一.窗口看门狗&#xff08;WWDG&#xff09;简介 二.窗口看门狗寄存器列表 三.窗口看门狗复位案例 一.窗口看门狗&#xff08;WWDG&#xff09;简介 CW32F030C8T6 内部集成窗口看…

2025年文件加密软件分享:守护数字世界的核心防线

在数字化时代&#xff0c;数据已成为个人与企业的宝贵资产&#xff0c;文件加密软件通过复杂的算法&#xff0c;确保信息在存储、传输与共享过程中的保密性、完整性与可用性。一、文件加密软件的核心原理文件加密软件算法以其高效性与安全性广泛应用&#xff0c;通过对文件数据…

node.js下载教程

1.项目环境文档 语雀 2.nvm安装教程与nvm常见命令,超详细!-阿里云开发者社区 C:\Windows\System32>nvm -v 1.2.2 C:\Windows\System32>nvm list available Error retrieving "http://npm.taobao.org/mirrors/node/index.json": HTTP Status 404 C:\Window…

(AI如何解决问题)在一个项目,跳转到外部html页面,页面布局

问题描述目前&#xff0c;ERP后台有很多跳转外部链接的地方&#xff0c;会直接打开一个tab显示。因为有些页面是适配手机屏幕显示&#xff0c;放在浏览器会超级大。不美观&#xff0c;因此提出优化。修改前&#xff1a;修改后&#xff1a;思考过程1、先看下代码&#xff1a;log…

网络通信协议与虚拟网络技术相关整理(上)

#作者&#xff1a;程宏斌 文章目录 tcp协议udp协议arp协议icmp协议dhcp协议BGP协议OSPF协议BGP vs OSPF 对比表VLAN&#xff08;Virtual LAN&#xff09;VXLAN&#xff08;Virtual Extensible LAN&#xff09;IPIP&#xff08;IP-in-IP&#xff09;vxlan/vlan/ipip网桥/veth网…

物联网软件层面的核心技术体系

物联网软件层面的核心技术体系 物联网(IoT)软件技术栈是一个多层次的复杂体系&#xff0c;涵盖从设备端到云平台的完整解决方案。以下是物联网软件层面的关键技术分类及详细说明&#xff1a; 一、设备端软件技术 1. 嵌入式操作系统 实时操作系统(RTOS)&#xff1a; FreeRTO…

GreatSQL通过伪装从库回放Binlog文件

GreatSQL通过伪装从库回放Binlog文件 一、适用场景说明 1、主库误操作恢复 利用 Binlog 在其他实例解析、回放&#xff0c;根据gtid只回放到指定位点。 2、网络隔离环境同步 备份恢复后可以拉去主库Binlog文件至新实例同步增量数据。 3、备份恢复遇到Binlog文件过大处理 恢复实…