JavaScript 设计模式:带示例的高级技术

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript 高级设计模式:从理论到实践

\n\n

设计模式是软件开发中经过验证的典型问题解决方案。对于使用 Node.js 的 JavaScript 开发者来说,理解高级模式为创建可扩展、灵活且易于维护的系统开辟了道路。在本文中,我们将分析四个关键模式:观察者模式、代理模式、责任链模式和策略模式。每个模式都将通过 Node.js 的实际示例进行说明。

\n\n

1. 观察者模式:Node.js 中的事件驱动架构

\n\n

观察者模式是基础的行为模式之一。它定义了对象之间的“一对多”依赖关系:当一个对象(主题)改变其状态时,所有依赖对象(观察者)都会自动收到通知并更新。在 Node.js 中,此模式是 EventEmitter 模块的基础。

\n\n

示例:在线商店的通知系统

\n

假设我们有一个管理订单的服务器。当订单状态发生变化时,需要通知多个子系统:日志记录、发送电子邮件和更新分析数据。

\n\n
const EventEmitter = require('events');\n\n// 主题 (Subject)\nclass OrderManager extends EventEmitter {\n    constructor() {\n        super();\n        this.orders = [];\n    }\n\n    createOrder(orderId, items) {\n        const order = { orderId, items, status: 'created', createdAt: new Date() };\n        this.orders.push(order);\n        this.emit('order:created', order);\n        return order;\n    }\n\n    updateStatus(orderId, newStatus) {\n        const order = this.orders.find(o => o.orderId === orderId);\n        if (order) {\n            order.status = newStatus;\n            this.emit('order:statusChanged', order);\n        }\n    }\n}\n\n// 观察者 (Observers)\nfunction logObserver(order) {\n    console.log(`[LOG] Order ${order.orderId}: status changed to ${order.status} at ${new Date().toISOString()}`);\n}\n\nfunction emailObserver(order) {\n    console.log(`[EMAIL] Sending notification for order ${order.orderId} with status ${order.status}`);\n}\n\nfunction analyticsObserver(order) {\n    console.log(`[ANALYTICS] Recording event: order ${order.orderId} -> ${order.status}`);\n}\n\n// 使用\nconst manager = new OrderManager();\nmanager.on('order:created', logObserver);\nmanager.on('order:statusChanged', logObserver);\nmanager.on('order:statusChanged', emailObserver);\nmanager.on('order:statusChanged', analyticsObserver);\n\nmanager.createOrder('ORD-001', ['Book', 'Pen']);\nmanager.updateStatus('ORD-001', 'shipped');\n
\n\n

这种方法允许在不修改主题代码的情况下添加或删除观察者,使系统灵活且易于扩展。

\n\n

2. 代理模式:访问控制和缓存

\n\n

代理模式提供了一个替代对象,用于管理对另一个对象的访问。在 JavaScript 中,此模式通过内置的 Proxy 对象实现,该对象允许拦截和重定义基本操作(属性访问、函数调用等)。

\n\n

示例:用于 API 请求的缓存代理

\n

假设我们有一个服务,用于对外部 API 进行昂贵的请求。我们希望缓存结果以避免重复调用。

\n\n
// 真实服务 (Real Subject)\nclass ExternalApiService {\n    async fetchUser(id) {\n        console.log(`Fetching user ${id} from external API...`);\n        // 模拟网络延迟\n        await new Promise(resolve => setTimeout(resolve, 1000));\n        return { id, name: `User ${id}`, email: `user${id}@example.com` };\n    }\n}\n\n// 代理 (Proxy)\nclass CachingProxy {\n    constructor(realService) {\n        this.realService = realService;\n        this.cache = new M                

博客

书籍推荐