1. 代理模式

1.1. 使用场景

代理模式在不改变原始对象的前提下,通过代理对象控制对其访问,通常用于权限控制、延迟加载、远程调用等场景。在前端开发中,可以通过代理模式对网络请求、缓存机制等进行控制。

1.2. 代码实现

class ApiService {request() {console.log('Making API request...');return 'Response from API';}
}class ApiServiceProxy {constructor() {this.apiservice = new ApiService();this.cache = null;}request() {if (!this.cache) {console.log('Fetching from API...');this.cache = this.apiservice.request();} else {console.log('Returning cached response...');}return this.cache;}
}// 使用代理模式
const apiProxy = new ApiServiceProxy();
console.log(apiProxy.request()); // Fetching from API... Response from API
console.log(apiProxy.request()); // Returning cached response... Response from API

1.3. 详细注释

  • ApiService:表示原始对象,提供基础的 API 请求功能。

  •  ApiServiceProxy:代理类,控制对 ApiService 的访问,缓存请求结果以避免多次 API 调用。

  • 代理模式用于在不修改原始对象的情况下,添加缓存或权限控制等功能。

1.4. 实际应用

  • 代理模式常用于缓存、权限管理、远程代理等场景,如在前端缓存 API 请求、延迟加载图片等。

2. 适配器模式

2.1. 使用场景

适配器模式用于将不兼容的接口转换为兼容的接口,解决不同对象或模块之间的兼容性问题。在前端开发中,适配器模式可用于将第三方库的接口适配为项目内部通用的接口形式。

2.2. 代码实现

class OldApi {oldRequest() {return 'Old API response';}
}class Adapter {constructor(oldApi) {this.oldApi = oldApi;}newRequest() {return this.oldApi.oldRequest();}
}// 使用适配器模式
const oldApi = new OldApi();
const adapter = new Adapter(oldApi);
console.log(adapter.newRequest()); // Old API response

2.3. 详细注释

  • OldApi:表示旧的接口,提供老旧的请求方式。

  • Adapter:适配器,将旧接口适配为新的接口,使得可以在新环境中使用旧的功能。

  • 适配器模式解决了接口不兼容的问题,便于老旧代码与新代码的集成。

2.4. 实际应用

  • 适配器模式常用于集成不同版本的接口或库,如将旧版 API 接口适配到新版项目中。

3. 装饰器模式

3.1. 使用场景

装饰器模式用于在不修改现有对象的情况下,动态地为其添加功能。在前端中,装饰器模式常用于为对象或函数动态添加功能,如事件处理、日志记录等。

3.2. 代码实现

class Coffee {cost() {return 5;}
}class MilkDecorator {constructor(coffee) {this.coffee = coffee;}cost() {return this.coffee.cost() + 1;}
}class SugarDecorator {constructor(coffee) {this.coffee = coffee;}cost() {return this.coffee.cost() + 0.5;}
}// 使用装饰器模式
let coffee = new Coffee();
coffee = new MilkDecorator(coffee);
coffee = new SugarDecorator(coffee);
console.log(coffee.cost()); // 6.5

3.3. 详细注释

  • Coffee:原始对象,表示基础的咖啡,提供基本功能。

  • MilkDecorator 和 SugarDecorator:装饰器类,动态为 Coffee 对象添加牛奶和糖的功能。

  • 装饰器模式通过包装对象的方式,动态添加功能而不修改原始类。

3.3. 实际应用

  • 装饰器模式常用于前端中动态功能的添加,如为按钮添加事件处理、为组件增加样式等。

4. 桥接模式

4.1. 使用场景

桥接模式用于将抽象部分和实现部分分离,使它们可以独立变化。常用于当一个对象有多个维度的变化时,将这些变化解耦。在前端开发中,桥接模式用于将功能和 UI 的实现分离,使得它们可以独立演进。

4.2. 代码实现

class Shape {constructor(color) {this.color = color;}draw() {throw new Error('draw() must be implemented');}
}class Circle extends Shape {draw() {console.log(`Drawing a ${this.color.getColor()} circle`);}
}class Color {getColor() {throw new Error('getColor() must be implemented');}
}class RedColor extends Color {getColor() {return 'red';}
}class BlueColor extends Color {getColor() {return 'blue';}
}// 使用桥接模式
const red = new RedColor();
const blue = new BlueColor();const redCircle = new Circle(red);
redCircle.draw(); // Drawing a red circleconst blueCircle = new Circle(blue);
blueCircle.draw(); // Drawing a blue circle

4.3. 详细注释

  • Shape:抽象类,定义了 draw 方法。

  • Circle:具体实现类,实现了 Shape 的 draw 方法。

  • Color:表示颜色抽象,可以有不同的颜色实现类如 RedColor 和 BlueColor。

  • 桥接模式将形状和颜色的实现解耦,可以独立扩展。

4.4. 实际应用

  • 桥接模式常用于将功能和实现分离,如在图形绘制中分离形状和颜色、在 UI 组件中分离外观和行为。

5. 组合模式

5.1. 使用场景

组合模式用于将对象组合成树形结构,以表示“部分-整体”的层次结构。前端中,组合模式常用于构建层次结构的 UI 组件,如菜单、文件夹结构等。

5.2. 代码实现

class MenuItem {constructor(name) {this.name = name;}show() {console.log(this.name);}
}class Menu {constructor(name) {this.name = name;this.items = [];}add(item) {this.items.push(item);}show() {console.log(this.name);this.items.forEach(item => item.show());}
}// 使用组合模式
const fileMenu = new Menu('File');
fileMenu.add(new MenuItem('New'));
fileMenu.add(new MenuItem('Open'));const editMenu = new Menu('Edit');
editMenu.add(new MenuItem('Undo'));
editMenu.add(new MenuItem('Redo'));const mainMenu = new Menu('Main Menu');
mainMenu.add(fileMenu);
mainMenu.add(editMenu);mainMenu.show();

5.3. 详细注释

  • MenuItem:表示基础菜单项,提供 show 方法。

  • Menu:组合类,包含多个 MenuItem 或其他 Menu,提供组合的 show 方法。

  • 组合模式允许树形结构的对象组合和处理,实现部分与整体的递归处理。

5.4. 实际应用

  • 组合模式常用于前端的树形结构、层次化菜单、文件目录管理等场景。

6. 外观模式

6.1. 使用场景

外观模式提供了一个简化的接口来访问复杂的系统,隐藏内部实现细节,减少客户端的复杂性。在前端开发中,外观模式常用于为复杂的库或系统提供简化的 API。

6.2. 代码实现

class Subsystem1 {operation() {return 'Subsystem1 operation';}
}class Subsystem2 {operation() {return 'Subsystem2 operation';}
}class Facade {constructor() {this.subsystem1 = new Subsystem1();this.subsystem2 = new Subsystem2();}operation() {return `${this.subsystem1.operation()} + ${this.subsystem2.operation()}`;}
}// 使用外观模式
const facade = new Facade();
console.log(facade.operation()); // Subsystem1 operation + Subsystem2 operation

6.3. 详细注释

  • Subsystem1 和 Subsystem2:表示复杂系统的部分。

  • Facade:外观类,提供简化的 operation 方法,统一调用多个子系统。

  • 外观模式通过提供一个简化的接口,隐藏了复杂系统的细节。

6.4. 实际应用

  • 外观模式常用于封装复杂的子系统,如封装多种 API 调用、封装复杂的 UI 逻辑等。

7. 享元模式

7.1. 使用场景

享元模式通过共享相同的对象来减少内存消耗,适用于需要大量相似对象的场景。在前端开发中,享元模式用于优化性能,如缓存对象、共享数据等。

7.2. 代码实现

class Flyweight {constructor(sharedState) {this.sharedState = sharedState;}operation(uniqueState) {console.log(`Shared: ${this.sharedState}, Unique: ${uniqueState}`);}
}class FlyweightFactory {constructor() {this.flyweights = {};}getFlyweight(sharedState) {if (!this.flyweights[sharedState]) {this.flyweights[sharedState] = new Flyweight(sharedState);}return this.flyweights[sharedState];}
}// 使用享元模式
const factory = new FlyweightFactory();const flyweight1 = factory.getFlyweight('Shared1');
flyweight1.operation('Unique1');const flyweight2 = factory.getFlyweight('Shared1');
flyweight2.operation('Unique2');console.log(flyweight1 === flyweight2); // true

7.3. 详细注释

  • Flyweight:享元对象,包含共享的状态 sharedState 。

  • FlyweightFactory:负责创建和管理共享的享元对象,避免重复创建相同的对象。

  • 享元模式通过共享对象,减少了内存消耗,提升了系统性能。

7.4. 实际应用

  • 享元模式常用于缓存机制、对象池、共享数据等需要大量相似对象的场景。

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

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

相关文章

摄像头模块在运动相机中的特殊应用

运动相机作为记录高速运动场景的专用设备,其摄像头模块的设计与普通消费电子产品存在显著差异。根据行业资料和技术发展,摄像头模块在运动相机中的特殊应用主要体现在以下五个维度:一、极端环境适应性设计运动相机的摄像头模块针对户外运动场…

SpringBoot + MinIO/S3 文件服务实现:FileService 接口与 FileServiceImpl 详解

在企业项目中,文件上传和管理是非常常见的需求。本文基于 芋道源码 的实现,介绍如何封装一个通用的 文件服务 FileService,支持:文件上传(保存数据库记录 存储文件到 S3/MinIO 等对象存储)文件下载与删除文…

Oracle RAC认证矩阵:规避风险的关键指南

RAC Certification Matrix(RAC认证矩阵) 是Oracle官方发布的硬件、软件与操作系统兼容性清单,明确规定了哪些平台、组件和版本可以正式支持Oracle RAC(Real Application Clusters)的部署。它是搭建或升级RAC环境时必须…

【自然语言处理与大模型】如何通过微调来agent性能?

虽然大模型本身具备一定的指令理解和工具调用潜力,但在实际应用中,尤其是在复杂或专业领域,往往需要通过微调来提升Agent的工具调用能力。问题一:基座模型无法准确识别或选择特定领域的工具当Agent需要在医疗、金融、法律、工业控…

在 Keil 中将 STM32 工程下载到 RAM 进行调试运行

在 Keil 中将 STM32 工程下载到 RAM 进行调试运行 在使用 STM32 进行调试时,默认情况下代码会被烧写到 Flash 中运行。然而,Flash 写入速度较慢,擦写次数有限,且调试过程中频繁烧写可能影响开发效率。在某些场景下(如快…

【51单片机】【protues仿真】基于51单片机宠物投食系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、LCD1602液晶显示时间、温度、食物重量 2、按键手动投喂食物​ 3、称重模块检测当前食物重量 4、食物重量小于阈值会声光警报并自动投喂 二、使用步骤 基于51单片机的宠物投食…

腾讯云负载均衡增加访问策略后访问失败

为了测试,在负载均衡的安全组添加2条安全策略,限制办公室内IP可访问,其他IP地址拒绝所有访问。结果,访问失败。经过反复测试,主要是js问价加载失败,动态接口访问代码返回正常。再进行测试,发现去…

CSS的文本样式

1.文本样式的分类注意&#xff1a;必须先建立标签&#xff0c;再在head中修改1.1字体样式1.1.1字体颜色代码演示<head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

R语言读取excel文件数据-解决na问题

文章目录安装R语言运行环境实现代码遇到的问题总结安装R语言运行环境 安装教程连接, 包含国内镜像快速下载 实现代码 实现思路&#xff1a;使用python将文件的空字符的位置变成0&#xff0c;生成csv文件后交给R语言处理python实现代码如下&#xff1a; import pandas as pd…

【Nginx 运维实战】版本替换:强制 vs 平滑升级全解析

【Nginx 运维实战】版本替换&#xff1a;强制 vs 平滑升级全解析一&#xff1a;版本替换的两种思路二&#xff1a;使用场景对比三&#xff1a;实战1&#xff09;强制替换1.备份旧版本2.替换为新版本3.**赋予执行权限**4.**重启 Nginx**2&#xff09;平滑替换1.确认进程文件2.备…

MQ-消息队列

定义 Mssage Queue&#xff1a;消息队列。它是一种“先进先出”&#xff08;FIFO&#xff09;的数据结构&#xff0c;用于在分布式系统或应用程序之间进行异步通信。组成1. 生产者&#xff08;Producer&#xff09;定义&#xff1a;消息的发送方&#xff0c;负责将业务系…

NVIDIA驱动程序核心的“即时编译器”(Just-in-Time, JIT Compiler)详细介绍

我们来详细、深入地剖析这个位于NVIDIA驱动程序核心的“即时编译器”&#xff08;Just-in-Time, JIT Compiler&#xff09;。它堪称CUDA生态系统成功的“幕后英雄”&#xff0c;是连接软件稳定性和硬件飞速发展的关键桥梁。 第一部分&#xff1a;JIT编译器的本质 首先&#xff…

【PS2025全网最新版】稳定版PS2025保姆级下载安装详细图文教程(附安装包)(Adobe Photoshop)

今天&#xff0c;给大家带来PS2025的保姆级下载安装图文教程。 前言&#xff1a; Adobe Photoshop 作为业界领先的图像处理与设计软件&#xff0c;持续推动着数字创意领域的发展。其应用涵盖平面设计、摄影后期、UI/UX 设计、影视特效等多个专业方向&#xff0c;为用户提供强…

分享TWS充电仓方案开发设计

TWS耳机市场“卷”到最后&#xff0c;拼的早已不只是音质&#xff0c;而是续航、交互、体积、成本四位一体。传统充电仓用多颗IC堆砌&#xff1a;升压、电量计、霍尔、LED驱动、保护IC……BOM高、贴片复杂、调试周期长。8位MCU把上述功能“一锅端”&#xff1a;单芯片即完成电源…

【Java实战㉖】深入Java单元测试:JUnit 5实战指南

目录一、单元测试概述1.1 单元测试概念1.2 单元测试优势1.3 JUnit 5 框架组成1.4 JUnit 5 环境搭建二、JUnit 5 核心功能实战2.1 测试类与测试方法2.2 测试生命周期2.3 断言方法2.4 异常测试三、单元测试进阶实战3.1 参数化测试3.2 测试套件3.3 Mockito 框架3.4 单元测试实战案…

分布式微服务--ZooKeeper作为分布式锁

看这篇博客之前可以先去了解博主的另一篇讲解ZooKeeper的博客&#xff1a;分布式微服务--ZooKeeper的客户端常用命令 & Java API 操作-CSDN博客 1. 为什么需要分布式锁&#xff1f; 在分布式系统中&#xff0c;多个服务节点可能同时访问或修改同一份共享资源&#xff08;例…

基于容器化云原生的 MySQL 及中间件高可用自动化集群项目

1 项目概述 本项目旨在构建一个高可用、高性能的 MySQL 集群,能够处理大规模并发业务。通过容器化部署、多级缓存、完善的监控和备份策略,确保数据库服务的连续性和数据安全性。 架构总览 预期目标 数据库服务可用性达到 99.99% 支持每秒 thousands 级别的并发访问 实现秒…

如何将 iPhone 备份到电脑/PC 的前 5 种方法

定期备份你的 iPhone&#xff08;最好每两周一次&#xff09;对于保护你的数据至关重要。它确保了如果设备损坏、丢失或被盗&#xff0c;或者你换了新手机&#xff0c;你不会丢失重要信息&#xff0c;并且可以轻松地从备份中恢复应用程序、照片、设置等。如果你不确定如何备份 …

国产AI芯片编程模型深度对比:寒武纪MLU vs 壁仞BR100异构计算设计

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;国产AI芯片的崛起与挑战 随着人工智能技术的飞速…

【项目】基于One Thread One Loop模型的高性能网络库实现 - 项目介绍与前置知识

目录 项目介绍 HTTP服务器基本认识 Reactor模式基本认识 单Reactor单线程模式认识 单Reactor多线程模式认识 多Reactor多线程模式认识 模块划分 Server模块 Buffer模块 Socket模块 Channel模块 Connection模块 Acceptor模块 TimerQueue模块 Poller模块 EventLo…