JavaScript 結構型設計模式詳解

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…