前端設計模式應用精析

引言

設計模式是前端工程化架構的基石,通過抽象核心場景解法提升代碼復用性與系統可維護性。本文精析 7 個核心模式,結合原生 JavaScript 與框架實踐,揭示模式在現代前端架構中的底層映射與應用。


1. 觀察者模式(Observer)

核心思想:狀態變更自動通知依賴對象,實現發布-訂閱解耦機制。

技術演進:從原生事件系統到響應式框架狀態管理。

// 原生實現(明確訂閱-通知生命周期)
class Observable {constructor() { this.observers = []; }subscribe(fn) { this.observers.push(fn); }  // 顯式訂閱unsubscribe(fn) { /* 移除邏輯 */ }          // 防止內存泄漏notify(data) {                              // 廣播狀態變更this.observers.forEach(observer => observer(data));}
}// 框架映射說明:
// - Vue reactive():基于 Proxy 實現細粒度依賴追蹤
// - React useState():狀態調度機制(非傳統觀察者),依賴 Fiber 架構批量更新

關鍵區分:原生觀察者需顯式管理訂閱關系,而框架通過虛擬 DOM/響應式代理自動處理依賴。


2. 策略模式(Strategy)

核心思想:封裝可互換算法族,運行時動態切換策略。

擴展場景:動態表單校驗規則、多端渲染策略適配(Web/Mobile)。

// 多策略組合驗證(支持異步)
const validationStrategies = {email: async (value) => { /* API 驗證 */ },password: (value) => /[A-Z]/.test(value)  // 包含大寫字母
};class Validator {constructor(strategies) {this.strategies = strategies;this.errors = [];}async validate(key, value) {const result = await this.strategies[key](value);if (!result) this.errors.push(`${key}驗證失敗`);}
}

工業實踐:Webpack 的 loader 鏈本質是策略管道,Vite 插件系統采用策略組合擴展編譯行為。


3. 裝飾器模式(Decorator)

核心思想:通過包裝器增強功能,遵循開放封閉原則。

技術深化:AOP(面向切面編程)實現日志/性能埋點。

// TypeScript 方法裝飾器(性能分析切面)
function logPerf(_: any, name: string, descriptor: PropertyDescriptor) {const original = descriptor.value;descriptor.value = function(...args) {const start = performance.now();const result = original.apply(this, args);console.log(`${name}執行耗時: ${performance.now() - start}ms`);return result;};
}class API {@logPerffetchData() { /* 網絡請求 */ }
}

框架約束:React HOC 需遵守 displayName 規范,避免 DevTools 調試混淆。


4. 單例模式(Singleton)

核心思想:確保類唯一實例,全局共享狀態/服務。

前端場景:全局狀態管理、瀏覽器存儲代理、WebSocket 連接池。

class AuthService {  // 單例身份驗證服務static instance;static getInstance() {if (!AuthService.instance) {AuthService.instance = new AuthService();}return AuthService.instance;}constructor() {this.token = localStorage.getItem('token');}login(token) { this.token = token;// 廣播登錄事件(結合觀察者)}
}// 全應用統一訪問點
const auth = AuthService.getInstance();

風險提示:單例模塊化需考慮服務注銷機制,避免 SPA 路由切換后狀態殘留。


5. 命令模式(Command)

核心思想:將操作封裝為對象,支持撤銷/重做與事務管理。

前端場景:操作歷史棧、批量任務調度、UI 動作解耦。

// 可撤銷的 Canvas 繪圖命令
class DrawCommand {constructor(canvas, params) {this.canvas = canvas;this.params = params;this.prevState = canvas.getState();  // 保存前一狀態}execute() {this.canvas.draw(this.params);}undo() {this.canvas.restore(this.prevState);  // 恢復歷史狀態}
}// 命令管理器(支持事務)
class CommandManager {history = [];invoke(command) {command.execute();this.history.push(command);}undo() {const cmd = this.history.pop();cmd?.undo();}
}

應用實例:富文本編輯器操作歷史、Redux 的 Action 命令化分發。


6. 代理模式(Proxy)

核心思想:中介對象控制訪問,實現緩存/驗證/懶加載。

性能優化:API 請求智能緩存代理。

const apiCache = new Map();const apiProxy = new Proxy(fetch, {  // 攔截 fetchasync apply(target, _, args) {const [url] = args;if (apiCache.has(url)) return apiCache.get(url);  // 返回緩存const res = await target(...args);                // 執行真實請求apiCache.set(url, res);return res;}
});// 使用代理后的 fetch
apiProxy('/data').then(...);

陷阱規避:Proxy 嵌套對象需遞歸代理,避免部分屬性未攔截。


7. 組合模式(Composite)

核心思想:統一處理樹狀結構,抽象部分-整體關系。

現代演進:微前端架構中的應用模塊樹。

// 插件系統組合(支持嵌套注冊)
const PluginSystem = ({ children }) => {useEffect(() => {// 遞歸初始化所有子插件React.Children.forEach(children, plugin => plugin.init?.());}, []);return <>{children}</>;
};<PluginSystem><AnalyticsPlugin /><PluginSystem>  {/* 嵌套組合 */}<SecurityPlugin /></PluginSystem>
</PluginSystem>

設計模式的應用

前端框架演進史本質是設計模式的融合實踐。解耦藝術通過觀察者模式將視圖層與數據流分離(如 Vue 的響應式系統),而控制反轉在工廠模式中體現為組件創建權移交框架(React 的 ReactDOM.createRoot)。單例模式實現全局狀態共享(Redux store),卻需警惕違反迪米特法則引發的隱式耦合。

在復雜交互場景,命令模式與策略模式的協同構成可撤銷操作流水線:

  1. 用戶動作封裝為命令對象(Command)

  2. 命令管理器按策略模式選擇執行/存儲方案

  3. 代理模式攔截命令執行,注入性能監控

當代架構趨勢如 React Server Components,本質是策略模式(渲染位置決策)、代理模式(服務端-客戶端組件橋接)與組合模式的深度融合。掌握模式內核,方能設計出 高內聚低耦合 的前端系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89249.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89249.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【機器學習深度學習】Ollama vs vLLM vs LMDeploy:三大本地部署框架深度對比解析

目錄 前言 一、為什么要本地部署大語言模型&#xff1f; 二、三大主流部署方案簡介 三、核心對比維度詳解 1?? 易用性對比 2?? 性能與并發能力 3?? 模型支持與生態兼容性 4?? 部署環境與平臺支持 四、一覽對比表 五、詳細介紹與比較 ? 1. Ollama ? 2. vL…

AWS ML Specialist 考試備考指南

以下是針對AWS機器學習專家認證(AWS Certified Machine Learning - Specialty)的備考指南精簡版,涵蓋核心要點和高效備考策略: ?一、考試核心要點? ?四大核心領域?: ?數據準備(28%)?:S3數據存儲、Glue ETL、Feature Store、數據清洗與特征工程。 ?模型開發(26%…

yolo8+ASR+NLP+TTS(視覺語音助手)

&#x1f9e9; 模塊總覽&#xff1a;步驟模塊作用①麥克風錄音&#xff08;VAD支持&#xff09;獲取語音并判斷是否有人說話②Whisper語音識別把語音內容識別為文字③DeepSeek 聊天接口發送用戶提問并獲取 AI 回復④edge-tts 朗讀回答把 DeepSeek 回答讀出來⑤整合成語音助手主…

Zabbix 分布式監控系統架構設計與優化

一、概念 1.核心概念 Zabbix是一個CS(服務端/客戶端)架構的服務Zabbix-Agent獲取數據-->發送給-->Zabbix-Server服務端--- >數據會被存放在數據庫 <--- Zabbix Web 頁面展示數據 2.部署流程 部署ngxphp環境并測試部署數據庫 mariadb 10.5及以上 然后進行配置編…

QT——文件選擇對話框 QFileDialog

QFileDialog概述QFileDialog是Qt框架中提供的文件對話框類&#xff0c;用于讓用戶選擇文件或目錄。它提供了標準的文件選擇界面&#xff0c;支持文件打開、保存、多選等常見操作。基本使用方式QFileDialog提供了兩種使用方式&#xff1a;靜態方法&#xff1a;直接調用類方法快速…

Flask+LayUI開發手記(十一):選項集合的數據庫擴展類

條目較少的選項集合&#xff0c;確實可以在程序中直接定義&#xff08;其實最合適的還是存儲在一個分類別的數據庫表里&#xff09;&#xff0c;但條目較多的選項集合&#xff0c;或者是復雜的樹型結構選項集合&#xff0c;一般都是存儲在數據庫中的&#xff0c;這樣維護起來比…

AI學習筆記三十二:YOLOv8-CPP-Inference測試(Linux版本)

若該文為原創文章&#xff0c;轉載請注明原文出處。主要介紹如何在Linux系統上安裝和部署基于YOLOv8的C推理項目一、服務器準備使用AutoDL平臺租用服務器AutoDL有git加速&#xff0c;可以自行啟用二、環境配件1、檢查Opencv版本pkg-config --modversion opencv4如果版本為4.5&a…

113:路徑總和 II

題目&#xff1a;給你二叉樹的根節點 root 和一個整數目標和 targetSum &#xff0c;找出所有 從根節點到葉子節點 路徑總和等于給定目標和的路徑。葉子節點 是指沒有子節點的節點。解答&#xff1a;用 go主要坑有兩個&#xff0c;一個是二維結果切片傳遞用指針&#xff0c;一個…

Perl 數組

Perl 數組 在Perl編程語言中&#xff0c;數組是處理數據的一種強大工具。數組允許我們將多個值存儲在單個變量中&#xff0c;從而簡化了代碼并提高了效率。本文將詳細介紹Perl數組的創建、操作、遍歷以及一些高級用法。 數組的創建 在Perl中&#xff0c;創建一個數組非常簡單。…

優先隊列的實現

目錄 引言 堆的基本概念與特性 堆的插入與向上調整 堆的刪除與向下調整 優先隊列的設計思路 模板參數設計 比較器的作用 核心接口實現 push pop top 附錄(完整代碼) 引言 優先隊列&#xff08;Priority Queue&#xff09;是一種特殊的隊列數據結構&#xff0c;其中每…

現代CSS實戰:用變量與嵌套重構可維護的前端樣式

現代CSS實戰&#xff1a;用變量與嵌套重構可維護的前端樣式 引言 在傳統CSS開發中&#xff0c;我們常常陷入「樣式冗余」與「維護噩夢」的循環&#xff1a; 想調整主題色&#xff1f;得全局搜索所有 #3498db 手動替換&#xff0c;稍有不慎就漏改某個角落&#xff1b; 寫嵌套…

DHTMLX Suite 9.2 重磅發布:支持歷史記錄、類Excel交互、剪貼板、拖放增強等多項升級

全球知名的 JavaScript UI 組件庫 DHTMLX Suite 迎來 9.2 新版本&#xff01;此次更新雖為次版本號&#xff0c;卻實質性提升了 Grid 網格組件的交互能力與用戶體驗&#xff0c;引入了包括歷史記錄管理、剪貼板操作、數據選擇范圍管理、Block 區塊選擇等多項高級模塊&#xff0…

深入理解Java中的Map.Entry接口

文章目錄深入理解Java中的Map.Entry接口1. 接口定義2. 核心方法解析2.1 基本方法2.2 Java 8新增的靜態方法3. 基本使用示例3.1 遍歷Map的條目3.2 修改Map中的值3.3 使用比較器排序4. Java 8/9增強特性4.1 與Stream API結合4.2 Java 9的equals和hashCode默認方法5. 實際應用場景…

AI培訓學習2

不要打擾用戶的習慣&#xff0c;比如APP右下角的我的&#xff0c;放到第一個就不合適 先抄再超 lifeTime value NPS: 評價 Product market 平衡 ARPU&#xff1a; LT活躍時長 游戲中好友的重要性 不花錢存活率很少 如何花錢&#xff0c;1分錢買東西 聯影醫療 figma uizard…

npm 安裝時候怎么指定某一個子包的版本 overrides

有時候用 npm install 安裝的時候會報錯&#xff0c;比如 express 包依賴 "escape-html": "^1.0.2" 版本的包&#xff0c;但是因為 escape-html" 升級到 1.0.3 版本了&#xff0c;但是這個版本有問題&#xff0c;導致express 下載不下來。怎么固定下載…

python學智能算法(十九)|SVM基礎概念-超平面

引言 前序學習進程中&#xff0c;對向量相關的基本知識進行了學習&#xff0c;鏈接為&#xff1a; 向量的值和方向 向量點積 在實際的支持向量機算法使用中&#xff0c;最核心的目標是找出可以實現分類的超平面&#xff0c;超平面就是分割的點、線或者面&#xff0c;不要在這個…

python 基于 httpx 的流式請求

文章目錄1. 環境介紹2. 同步客戶端2.1. 面向過程2.1.1. 流式輸出2.1.2. 非流式輸出2.2. 面向對象3. 異步客戶端3.1. 面向過程3.2. 面向對象3.3. Attempted to call a sync iterator on an async stream.參考&#xff1a;https://www.jb51.net/article/262636.htm次要參考&#…

Python 數據建模與分析項目實戰預備 Day 4 - EDA(探索性數據分析)與可視化

? 今日目標 使用 Pandas Matplotlib/Seaborn 對簡歷數據進行探索性分析分析不同字段與目標變量的相關性通過可視化呈現簡歷篩選的潛在規律&#x1f9fe; 一、建議分析內容 &#x1f539; 分類字段分析字段圖表建議說明degree柱狀圖&#xff08;分組通過率&#xff09;分析學歷…

力扣每日一題--2025.7.17

&#x1f4da; 力扣每日一題–2025.7.17 &#x1f4da; 3202. 找出有效子序列的最大長度 II&#xff08;中等&#xff09; 今天我們要解決的是力扣上的第 3202 題——找出有效子序列的最大長度 II。這道題是昨天 3201 題的擴展&#xff0c;需要我們處理更一般化的情況。 ??…

github不能訪問怎么辦

訪問&#xff1a;“github.com”國內多個地點網站測速結果_網站測速 - 站長工具訪問“github.global.ssl.fastly.net”國內多個地點網站測速結果_網站測速 - 站長工具復制紅框中的ip 打開“C:\Windows\System32\drivers\etc\hosts”文件輸入&#xff1a; 20.205.243.166 githu…