前端常见设计模式

以下是前端开发中常见的设计模式及其核心思想、应用场景和示例,结合了多个资料源的综合总结:


一、创建型模式

1. 单例模式(Singleton)

核心思想:确保全局仅有一个实例,并提供统一访问点。
应用场景:全局状态管理(如 Vuex/Redux 的 Store)、配置对象、弹窗组件。
示例

// ES6 模块实现单例
const config = { apiUrl: 'https://api.example.com' };
export default config;// 通用单例构造器
const getSingle = (fn) => {let instance;return () => instance || (instance = fn.apply(this, arguments));
};

2. 工厂模式(Factory)

核心思想:封装对象创建过程,通过统一接口动态生成对象。
应用场景:UI 组件库(如 React.createElement)、动态创建复杂对象。
示例

// 用户对象工厂
function createUser(name, role) {return {name,role,greet() {console.log(`Hi, I'm ${name}, a ${role}`);}};
}
const admin = createUser("Alice", "Admin");

二、结构型模式

3. 观察者模式(Observer)

核心思想:对象间一对多依赖,状态变更自动通知所有依赖。
应用场景:Vue 响应式系统、自定义事件总线。
示例

class Subject {observers = [];addObserver(obs) { this.observers.push(obs); }notify(data) { this.observers.forEach(obs => obs.update(data)); }
}
class Observer {update(data) { console.log("Received:", data); }
}

4. 代理模式(Proxy)

核心思想:通过中介控制对象访问,添加额外逻辑。
应用场景:图片懒加载、API 请求拦截、权限控制。
示例

// 图片加载代理
const proxyImage = (src) => {const img = new Image();img.src = 'loading.gif';const realImg = new Image();realImg.onload = () => img.src = src;realImg.src = src;return img;
};

5. 适配器模式(Adapter)

核心思想:转换接口使其兼容不同系统。
应用场景:第三方库兼容、新旧 API 过渡。
示例

// 旧 API 适配新接口
const legacyApi = { getData: () => "old data" };
const adapter = {fetch() {return legacyApi.getData().toUpperCase();}
};

三、行为型模式

6. 策略模式(Strategy)

核心思想:封装可互换的算法族,动态切换策略。
应用场景:表单验证规则、促销计算。
示例

const strategies = {isNonEmpty: (val) => val !== "",minLength: (val, len) => val.length >= len
};
function validate(value, rules) {return rules.every(rule => strategies[rule.type](value, rule.param));
}

7. 装饰器模式(Decorator)

核心思想:动态扩展对象功能,不修改原结构。
应用场景:React 高阶组件、日志增强。
示例

// 日志装饰器
function withLogging(WrappedComponent) {return class extends React.Component {componentDidMount() {console.log("Component mounted");}render() {return <WrappedComponent {...this.props} />;}};
}

8. 发布订阅模式(Pub-Sub)

核心思想:解耦事件发布者与订阅者,支持多对多通信。
应用场景:跨组件通信(如 Redux)、异步事件处理。
示例

const eventBus = {events: {},subscribe(event, callback) {this.events[event] = this.events[event] || [];this.events[event].push(callback);},publish(event, data) {this.events[event]?.forEach(cb => cb(data));}
};

四、其他重要模式

9. 模块模式(Module)

核心思想:封装代码为独立模块,避免全局污染。
应用场景:工具库封装、私有变量保护。
示例

const utils = (() => {const privateVar = "secret";return {publicMethod() { return privateVar; }};
})();

10. 组合模式(Composite)

核心思想:以树形结构组合对象,统一操作接口。
应用场景:复杂 UI 组件(如树形菜单)、嵌套表单。
示例

class TreeNode {children = [];add(child) { this.children.push(child); }execute() { this.children.forEach(child => child.execute()); }
}

设计模式原则

单一职责:一个类/函数只做一件事(如弹窗组件仅管理显示逻辑)。
开放封闭:对扩展开放,对修改关闭(如通过装饰器扩展功能而非修改原代码)。

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

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

相关文章

前端异步(async)解决方案

原文链接:https://zhuanlan.zhihu.com/p/165948917 javascript是一门单线程语言,即一次只能完成一个任务,若有多个任务要执行,则必须排队按照队列来执行(前一个任务完成,再执行下一个任务)。 这种模式执行简单,但随着日后的需求,事务,请求增多,这种单线程模式执行效率必定低下…

煤矿井下人员入侵预警防爆摄像头

矿井人员入侵监测预警防爆摄像机嵌入AI人体识别算法,对人体目标特征的检测分析识别预警。防爆AI智能预警摄像机采用AI算法,通过大量真实的场景样本训练后,能够在各种应用场景下及时准确的对场景中发生的人体入侵行为发出告警信息。通过对实时视频图像进行智能分析识别,可实…

MODBUS RTU转EtherNet/IP基于网关的森兰变频器与欧姆龙系统通讯配置实战经验分享

在工业自动化控制领域,不同品牌和类型的设备之间的互联互通是实现高效生产和智能化管理的关键。本案例涉及到森兰变频器与欧姆龙控制系统之间的通讯连接,通过捷米特JM-EIP-RTU网关模块实现 MODBUS RTU 协议与EtherNet/IP 协议的转换,构建稳定可靠的通讯链路,以满足工业生产…

超详细!Spring Boot项目结合Maven Profile实现多环境切换,轻松搞定开发部署难题

在当今的软件开发中,一个项目往往需要在不同的环境中运行,如开发、测试和生产环境。每个环境都有其独特的配置需求,如何高效地管理这些配置,让项目在不同环境中顺利运行,成为了开发者们必须面对的问题。Spring Boot 和 Maven 作为 Java 开发中非常流行的框架和构建工具,为…

小区楼道电动车监控识别预警系统

楼道电动车监控识别预警系统采用机器视觉图像感知技术,通过人工智能机器深度学习能力,对自行车、电动车和摩托车精确检测、跟踪、识别,实现对非机动车检测分析识别,在机器视觉图像景中,通过非机动车识别算法建立图像模型,完成自动检测识别非机动车,并能以视觉图像智能分…

供应链管理必须要掌握的10个常用指标及计算公式详解!

供应链管理对于很多公司来说,可能是一个看不见摸不着的“幕后英雄”。但是,掌握了核心的供应链管理指标,你就能把这些“幕后工作”做到位,提升公司整体运营效率,减少成本,甚至提高客户满意度。 今天我们就来聊聊,供应链管理中最重要的10个常用指标和它们的计算公式。如果…

分享 5 个在微信中使用 DeepSeek 的方法,建议收藏!

前言 今天大姚将为大家分享5种在微信中使用DeepSeek的方法,帮助大家更好地利用这一工具,提升工作和学习效率。无论是处理文档、管理知识,还是进行深度搜索和思考,这些方法都将为你带来全新的体验。让我们一起探索DeepSeek在微信中的无限可能吧!公众号「追逐时光者」回复关…

用python制作太阳花

点击查看代码 from turtle import * color(red,yellow) begin_fill() while True:forward(200)left(170)if abs(pos())<1:break end_fill() done()

使用Acronis True Image恢复系统

在U深度PE环境中,使用Acronis True Image恢复系统。只要平常时,做好服务器或是工作端的系统备份,遇上系统崩溃或是某种原因,需要恢复时,可以参考下面方法来恢复。准备好备份xxx.tib....U深度U盘启动,进入维护环境,运行傲梅开区助手(1),查看硬盘分区情部分,如磁盘1,未…

15.7.2 微调BERT的数据集

在我们已经训练好BERT后,BERT就可以对输入的每一个词元返回抽取了上下文信息的特征向量(也就是对于任意一个词元,将这个词元当做查询,所有词元当做键值对) 一些任务如下这里将<cls>的特征向量传递给全连接层的原因就是因为<cls>本来就是用来分类的,所以肯定传…

【分享】FTP为何被摒弃,如何选择适配的国产FTP传输软件?

在数字化浪潮中,文件传输是日常工作里不可或缺的一环。提及文件传输,FTP(文件传输协议)大家都不陌生,它就像一位勤勤恳恳的老邮差,多年来一直承担着文件传输的重任。凭借着简单易用、广泛支持、兼容性好以及成本低廉的优点,FTP在全球各地广泛应用,成为许多企业和个人进…

实验1作业

四、运行结果分析 1.task 1: 代码1(1个字符小人):#include <stdio.h> int main(){printf(" O \n");printf("\n");printf("I I\n"); return 0; } 运行结果截图: 代码2(两个竖着的小人): #include <stdio.h> int main(){prin…