亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
1. 模塊模式(Module Pattern)——封裝私有狀態(tài)
2. 工廠模式(Factory Pattern)——?jiǎng)?chuàng)建對(duì)象的統(tǒng)一入口
3. 觀察者模式(Observer Pattern)——實(shí)現(xiàn)事件驅(qū)動(dòng)
4. 單例模式(Singleton Pattern)——確保唯一實(shí)例
5. 裝飾器模式(Decorator Pattern)——?jiǎng)討B(tài)擴(kuò)展功能
總結(jié):如何選擇合適的設(shè)計(jì)模式?
首頁(yè) web前端 H5教程 可維護(hù)代碼的JavaScript設(shè)計(jì)模式

可維護(hù)代碼的JavaScript設(shè)計(jì)模式

Jul 27, 2025 am 04:01 AM
設(shè)計(jì)模式

模塊模式通過(guò)閉包封裝私有狀態(tài),利用IIFE創(chuàng)建獨(dú)立作用域並暴露有限接口,有效避免全局污染並提升可測(cè)試性;2. 工廠模式集中對(duì)象創(chuàng)建邏輯,根據(jù)參數(shù)返回不同類型的對(duì)象實(shí)例,減少客戶端對(duì)具體類的依賴;3. 觀察者模式建立一對(duì)多的事件通知機(jī)制,實(shí)現(xiàn)發(fā)布者與訂閱者解耦,適用於事件驅(qū)動(dòng)系統(tǒng);4. 單例模式確保一個(gè)類僅有一個(gè)實(shí)例,並提供全局訪問(wèn)點(diǎn),常用於日誌器、配置管理等場(chǎng)景;5. 裝飾器模式在不修改原對(duì)象的基礎(chǔ)上動(dòng)態(tài)添加功能,支持關(guān)注點(diǎn)分離,可用於性能監(jiān)控、權(quán)限校驗(yàn)等橫切邏輯;選擇設(shè)計(jì)模式應(yīng)基於具體需求:封裝私有數(shù)據(jù)用模塊模式,多種對(duì)象創(chuàng)建用工廠模式,解耦事件用觀察者模式,保證唯一實(shí)例用單例模式,動(dòng)態(tài)擴(kuò)展功能用裝飾器模式,合理應(yīng)用能提升代碼結(jié)構(gòu)清晰度、復(fù)用性和可維護(hù)性,但應(yīng)避免過(guò)度設(shè)計(jì)。

編寫(xiě)可維護(hù)的JavaScript 代碼,離不開(kāi)對(duì)設(shè)計(jì)模式的理解和合理應(yīng)用。設(shè)計(jì)模式是解決常見(jiàn)問(wèn)題的成熟方案,能提升代碼的結(jié)構(gòu)清晰度、復(fù)用性和可測(cè)試性。以下是幾個(gè)在實(shí)際開(kāi)發(fā)中非常實(shí)用的JavaScript 設(shè)計(jì)模式,幫助你寫(xiě)出更易於維護(hù)的代碼。


1. 模塊模式(Module Pattern)——封裝私有狀態(tài)

JavaScript 沒(méi)有原生的private關(guān)鍵字,但可以通過(guò)閉包實(shí)現(xiàn)私有變量和方法。模塊模式利用立即執(zhí)行函數(shù)(IIFE)創(chuàng)建獨(dú)立作用域,對(duì)外只暴露必要的接口。

 const UserModule = (function () {
  let users = []; // 私有變量function validateName(name) {
    return name && name.length > 1;
  }

  return {
    add(name) {
      if (validateName(name)) {
        users.push(name);
        console.log(`${name} added.`);
      } else {
        console.log("Invalid name");
      }
    },
    list() {
      return [...users]; // 返回副本,避免外部直接修改}
  };
})();

優(yōu)點(diǎn)

  • 隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié)
  • 避免全局變量污染
  • 易於單元測(cè)試(通過(guò)暴露的接口)

小技巧:現(xiàn)代ES6 模塊( import / export )已經(jīng)原生支持模塊化,但在需要私有狀態(tài)時(shí),閉包封裝依然有價(jià)值。


2. 工廠模式(Factory Pattern)——?jiǎng)?chuàng)建對(duì)象的統(tǒng)一入口

當(dāng)你需要根據(jù)條件創(chuàng)建不同類型的對(duì)象時(shí),工廠模式可以集中創(chuàng)建邏輯,避免重複的new操作。

 function createUser(type, name) {
  return {
    admin: () => ({ role: "admin", name, permissions: ["read", "write", "delete"] }),
    user: () => ({ role: "user", name, permissions: ["read"] }),
    guest: () => ({ role: "guest", name, permissions: ["read"] })
  }[type] || (() => ({ role: "unknown", name }));
}

// 使用const admin = createUser("admin", "Alice")();
const regularUser = createUser("user", "Bob")();

適用場(chǎng)景

  • 創(chuàng)建具有相似結(jié)構(gòu)但行為不同的對(duì)象
  • 減少客戶端代碼對(duì)具體類的依賴
  • 配置化對(duì)像生成(如表單控件、UI 組件)

3. 觀察者模式(Observer Pattern)——實(shí)現(xiàn)事件驅(qū)動(dòng)

觀察者模式用於實(shí)現(xiàn)一對(duì)多的依賴關(guān)係,當(dāng)一個(gè)對(duì)象狀態(tài)改變時(shí),所有依賴者都會(huì)收到通知。非常適合處理事件系統(tǒng)、狀態(tài)更新等場(chǎng)景。

 class EventObserver {
  constructor() {
    this.observers = new Map(); // key: event, value: array of callbacks
  }

  subscribe(event, callback) {
    if (!this.observers.has(event)) {
      this.observers.set(event, []);
    }
    this.observers.get(event).push(callback);
  }

  notify(event, data) {
    const callbacks = this.observers.get(event);
    if (callbacks) {
      callbacks.forEach(cb => cb(data));
    }
  }

  unsubscribe(event, callback) {
    const callbacks = this.observers.get(event);
    if (callbacks) {
      const index = callbacks.indexOf(callback);
      if (index > -1) {
        callbacks.splice(index, 1);
      }
    }
  }
}

// 使用const eventBus = new EventObserver();

eventBus.subscribe("userLogin", user => {
  console.log("Welcome, " user);
});

eventBus.notify("userLogin", "John"); // 輸出: Welcome, John

優(yōu)勢(shì)

  • 解耦發(fā)布者和訂閱者
  • 支持動(dòng)態(tài)綁定和解綁
  • 可用於狀態(tài)管理雛形(如簡(jiǎn)易版Vuex)

4. 單例模式(Singleton Pattern)——確保唯一實(shí)例

某些對(duì)像只需要一個(gè)實(shí)例(如配置管理器、日誌器、數(shù)據(jù)庫(kù)連接),單例模式可以保證全局唯一。

 class Logger {
  constructor() {
    if (Logger.instance) {
      return Logger.instance;
    }
    this.logs = [];
    Logger.instance = this;
  }

  log(message) {
    this.logs.push(message);
    console.log(`[LOG] ${message}`);
  }

  getLogCount() {
    return this.logs.length;
  }
}

// 使用const logger1 = new Logger();
const logger2 = new Logger();
console.log(logger1 === logger2); // true

注意:構(gòu)造函數(shù)中判斷實(shí)例是否存在,避免多次初始化。

適用場(chǎng)景

  • 全局配置中心
  • 緩存管理
  • 路由實(shí)例

5. 裝飾器模式(Decorator Pattern)——?jiǎng)討B(tài)擴(kuò)展功能

裝飾器模式允許你在不修改原對(duì)象的前提下,動(dòng)態(tài)添加新功能。 ES2023 支持裝飾器語(yǔ)法(需Babel 或TypeScript),但也可以手動(dòng)實(shí)現(xiàn)。

 function withTiming(fn) {
  return function (...args) {
    console.log("Starting...");
    const start = performance.now();
    const result = fn.apply(this, args);
    const end = performance.now();
    console.log(`Execution time: ${end - start} ms`);
    return result;
  };
}

function fetchData() {
  // 模擬耗時(shí)操作for (let i = 0; i < 1e7; i ) {}
  return "Data fetched";
}

const timedFetch = withTiming(fetchData);
timedFetch();

用途

  • 日誌、性能監(jiān)控
  • 權(quán)限校驗(yàn)
  • 輸入驗(yàn)證

總結(jié):如何選擇合適的設(shè)計(jì)模式?

  • 需要封裝私有數(shù)據(jù)? →模塊模式
  • 多種對(duì)象創(chuàng)建邏輯? →工廠模式
  • 解耦事件通知? →觀察者模式
  • 全局唯一實(shí)例? →單例模式
  • 動(dòng)態(tài)增強(qiáng)功能? →裝飾器模式

這些模式不是銀彈,關(guān)鍵在於理解其意圖,並在合適場(chǎng)景下使用。過(guò)度設(shè)計(jì)反而會(huì)增加複雜度。保持代碼簡(jiǎn)單、清晰、可讀,才是可維護(hù)性的核心。

基本上就這些,不復(fù)雜但容易忽略。

以上是可維護(hù)代碼的JavaScript設(shè)計(jì)模式的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

Java框架中設(shè)計(jì)模式與架構(gòu)模式的區(qū)別 Java框架中設(shè)計(jì)模式與架構(gòu)模式的區(qū)別 Jun 02, 2024 pm 12:59 PM

在Java框架中,設(shè)計(jì)模式和架構(gòu)模式的區(qū)別在於:設(shè)計(jì)模式定義了在軟體設(shè)計(jì)中解決常見(jiàn)問(wèn)題的抽象解決方案,專注於類別和物件之間的交互,例如工廠模式。架構(gòu)模式定義了系統(tǒng)結(jié)構(gòu)和模組之間的關(guān)係,關(guān)注系統(tǒng)元件的組織和交互,如分層架構(gòu)。

PHP設(shè)計(jì)模式:測(cè)試驅(qū)動(dòng)開(kāi)發(fā)實(shí)踐 PHP設(shè)計(jì)模式:測(cè)試驅(qū)動(dòng)開(kāi)發(fā)實(shí)踐 Jun 03, 2024 pm 02:14 PM

TDD用於編寫(xiě)高品質(zhì)PHP程式碼,步驟包括:編寫(xiě)測(cè)試案例,描述預(yù)期功能並使其失敗。編寫(xiě)程式碼,僅使測(cè)試案例通過(guò),無(wú)需過(guò)度優(yōu)化或詳細(xì)設(shè)計(jì)。測(cè)試案例通過(guò)後,優(yōu)化和重構(gòu)程式碼以提高可讀性、可維護(hù)性和可擴(kuò)展性。

Guice框架中設(shè)計(jì)模式的應(yīng)用 Guice框架中設(shè)計(jì)模式的應(yīng)用 Jun 02, 2024 pm 10:49 PM

Guice框架應(yīng)用了多項(xiàng)設(shè)計(jì)模式,包括:?jiǎn)卫J剑和高^(guò)@Singleton註解確保類別只有一個(gè)實(shí)例。工廠方法模式:透過(guò)@Provides註解建立工廠方法,在依賴注入時(shí)取得物件實(shí)例。策略模式:將演算法封裝成不同策略類,透過(guò)@Named註解指定具體策略。

Java設(shè)計(jì)模式之裝飾器模式剖析 Java設(shè)計(jì)模式之裝飾器模式剖析 May 09, 2024 pm 03:12 PM

裝飾器模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,允許動(dòng)態(tài)添加物件功能,無(wú)需修改原始類別。它透過(guò)抽象組件、具體組件、抽象裝飾器和具體裝飾器的協(xié)作實(shí)現(xiàn),可以靈活擴(kuò)展類別功能,滿足變化的需求。範(fàn)例中,將牛奶和摩卡裝飾器添加到Espresso,總價(jià)為2.29美元,展示了裝飾器模式在動(dòng)態(tài)修改物件行為方面的強(qiáng)大功能。

Spring MVC架構(gòu)中設(shè)計(jì)模式的應(yīng)用 Spring MVC架構(gòu)中設(shè)計(jì)模式的應(yīng)用 Jun 02, 2024 am 10:35 AM

SpringMVC框架使用以下設(shè)計(jì)模式:1.單例模式:管理Spring容器;2.門(mén)面模式:協(xié)調(diào)控制器、視圖和模型互動(dòng);3.策略模式:根據(jù)請(qǐng)求選擇請(qǐng)求處理程序;4.觀察者模式:發(fā)布和監(jiān)聽(tīng)?wèi)?yīng)用程式事件。這些設(shè)計(jì)模式增強(qiáng)了SpringMVC的功能和靈活性,使開(kāi)發(fā)者可以創(chuàng)建高效、可維護(hù)的應(yīng)用程式。

java框架中使用設(shè)計(jì)模式的優(yōu)缺點(diǎn)有哪些? java框架中使用設(shè)計(jì)模式的優(yōu)缺點(diǎn)有哪些? Jun 01, 2024 pm 02:13 PM

Java框架中使用設(shè)計(jì)模式的優(yōu)點(diǎn)包括:程式碼可讀性、可維護(hù)性和可擴(kuò)充性增強(qiáng)。缺點(diǎn)包括:過(guò)度使用導(dǎo)致複雜性、效能開(kāi)銷(xiāo)以及學(xué)習(xí)曲線陡峭。實(shí)戰(zhàn)案例:代理模式用於延遲載入物件。明智地使用設(shè)計(jì)模式可充分利用其優(yōu)勢(shì)並最小化缺點(diǎn)。

PHP設(shè)計(jì)模式:用於解決特定軟體問(wèn)題的模式 PHP設(shè)計(jì)模式:用於解決特定軟體問(wèn)題的模式 Jun 01, 2024 am 11:07 AM

PHP設(shè)計(jì)模式提供了已知解決方案來(lái)應(yīng)對(duì)軟體開(kāi)發(fā)中常見(jiàn)的問(wèn)題。常見(jiàn)的模式類型包括創(chuàng)建型(例如工廠方法模式)、結(jié)構(gòu)型(例如裝飾器模式)和行為型(例如觀察者模式)。設(shè)計(jì)模式在解決重複性問(wèn)題、提高可維護(hù)性和促進(jìn)團(tuán)隊(duì)合作時(shí)特別有用。在電商系統(tǒng)中,觀察者模式可以實(shí)現(xiàn)購(gòu)物車(chē)與訂單狀態(tài)之間的自動(dòng)更新。整體而言,PHP設(shè)計(jì)模式是創(chuàng)建健壯、可擴(kuò)展且可維護(hù)應(yīng)用程式的重要工具。

設(shè)計(jì)模式與測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的關(guān)係 設(shè)計(jì)模式與測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的關(guān)係 May 09, 2024 pm 04:03 PM

TDD與設(shè)計(jì)模式可提高程式碼品質(zhì)和可維護(hù)性。 TDD確保測(cè)試覆蓋率,提高可維護(hù)性,並提高程式碼品質(zhì)。設(shè)計(jì)模式透過(guò)鬆散耦合和高內(nèi)聚等原則協(xié)助TDD,確保測(cè)試涵蓋應(yīng)用程式行為的各個(gè)方面。它還透過(guò)可重用性,可維護(hù)性和更健壯的程式碼可提高可維護(hù)性和程式碼品質(zhì)。

See all articles