面試之《前端常見的設計模式》

前端開發中運用多種設計模式可以提高代碼的可維護性、可擴展性和可復用性。以下是一些常見的前端設計模式:

創建型模式

1. 單例模式
  • 定義:確保一個類只有一個實例,并提供一個全局訪問點。
  • 應用場景:在前端中,像全局狀態管理對象、數據庫連接對象等通常使用單例模式。例如,在 React 項目中使用 Redux 管理全局狀態,Redux 的 store 就是一個單例,整個應用只有一個 store 實例。
  • 示例代碼(JavaScript)
class Singleton {constructor() {if (!Singleton.instance) {this.data = [];Singleton.instance = this;}return Singleton.instance;}addItem(item) {this.data.push(item);}getData() {return this.data;}
}
const singleton1 = new Singleton();
const singleton2 = new Singleton();
console.log(singleton1 === singleton2); // true
2. 工廠模式
  • 定義:定義一個創建對象的接口,讓子類決定實例化哪個類。
  • 應用場景:當創建對象的邏輯比較復雜時,使用工廠模式可以將對象的創建和使用分離。例如,在創建不同類型的彈窗組件時,可以使用工廠模式根據不同的參數創建不同樣式和功能的彈窗。
  • 示例代碼(JavaScript)
class Button {constructor(text) {this.text = text;}render() {return `<button>${this.text}</button>`;}
}class Link {constructor(text, url) {this.text = text;this.url = url;}render() {return `<a href="${this.url}">${this.text}</a>`;}
}class ElementFactory {createElement(type, ...args) {if (type === 'button') {return new Button(...args);} else if (type === 'link') {return new Link(...args);}return null;}
}const factory = new ElementFactory();
const button = factory.createElement('button', 'Click me');
const link = factory.createElement('link', 'Google', 'https://www.google.com');
console.log(button.render());
console.log(link.render());

結構型模式

1. 裝飾器模式
  • 定義:動態地給一個對象添加一些額外的職責。
  • 應用場景:在前端中,常用于給組件添加額外的功能,如添加樣式、事件處理等。例如,在 React 中可以使用高階組件(HOC)來實現裝飾器模式,給組件添加日志記錄、權限驗證等功能。
  • 示例代碼(JavaScript)
function logDecorator(component) {return class extends React.Component {componentDidMount() {console.log('Component mounted');}render() {return <component {...this.props} />;}};
}class MyComponent extends React.Component {render() {return <div>My Component</div>;}
}const DecoratedComponent = logDecorator(MyComponent);
2. 代理模式
  • 定義:為其他對象提供一種代理以控制對這個對象的訪問。
  • 應用場景:在前端中,常用于處理圖片懶加載、數據緩存等。例如,使用代理對象來控制對圖片資源的訪問,當圖片進入可視區域時再加載真實的圖片資源。
  • 示例代碼(JavaScript)
class Image {constructor(src) {this.src = src;this.loadImage();}loadImage() {console.log(`Loading image from ${this.src}`);}display() {console.log(`Displaying image from ${this.src}`);}
}class ProxyImage {constructor(src) {this.src = src;this.realImage = null;}display() {if (!this.realImage) {this.realImage = new Image(this.src);}this.realImage.display();}
}const proxy = new ProxyImage('https://example.com/image.jpg');
proxy.display();

行為型模式

1. 觀察者模式
  • 定義:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴它的對象都會得到通知并自動更新。
  • 應用場景:在前端中,常用于實現事件系統、狀態管理等。例如,在 Vue.js 中,響應式原理就是基于觀察者模式實現的,當數據發生變化時,會自動更新與之綁定的 DOM 元素。
  • 示例代碼(JavaScript)
class EventEmitter {constructor() {this.events = {};}on(eventName, callback) {if (!this.events[eventName]) {this.events[eventName] = [];}this.events[eventName].push(callback);}emit(eventName, ...args) {if (this.events[eventName]) {this.events[eventName].forEach(callback => callback(...args));}}off(eventName, callback) {if (this.events[eventName]) {this.events[eventName] = this.events[eventName].filter(cb => cb!== callback);}}
}const emitter = new EventEmitter();
const callback = (message) => {console.log(`Received message: ${message}`);
};
emitter.on('message', callback);
emitter.emit('message', 'Hello, world!');
emitter.off('message', callback);
emitter.emit('message', 'This message won\'t be received.');
2. 狀態模式
  • 定義:允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。
  • 應用場景:在前端中,常用于實現組件的不同狀態切換,如按鈕的不同狀態(正常、禁用、加載中)。
  • 示例代碼(JavaScript)
class ButtonState {constructor(button) {this.button = button;}click() {}render() {}
}class NormalState extends ButtonState {click() {console.log('Button clicked');}render() {return '<button>Normal</button>';}
}class DisabledState extends ButtonState {click() {console.log('Button is disabled');}render() {return '<button disabled>Disabled</button>';}
}class Button {constructor() {this.state = new NormalState(this);}setState(state) {this.state = state;}click() {this.state.click();}render() {return this.state.render();}
}const button = new Button();
button.click();
button.setState(new DisabledState(button));
button.click();

以上只是前端開發中常見的一些設計模式,實際應用中可以根據具體需求選擇合適的設計模式來優化代碼。

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

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

相關文章

Unity Android出包

Unity Android出包 1.Android Studio版本 不能高于Unity的版本 2.so庫 這個庫需要自己拷貝到Android工程當中 3.JDK版本太老 編譯可以正常&#xff0c;但無法運行 File->ProjectStructure->SDK Location->Gradle Setting->Gradle JDK->X:/Android Stuido/jre …

Android 中臨時文件存放路徑選擇

在 Android 中&#xff0c;下載臨時文件通常可以放在以下目錄中&#xff0c;具體選擇取決于應用的需求和目標 Android 版本的限制&#xff1a; 1. 通用臨時目錄&#xff08;/data/local/tmp/&#xff09; 這是 Android 系統提供的一個通用臨時目錄&#xff0c;適用于存儲臨時…

【軟件測試】--面試

準備簡歷–面試邀請 投遞簡歷 面試&#xff08;筆試&#xff0c;HR面試&#xff0c;技術官面試&#xff09; 入職準備&#xff08;體檢&#xff0c;背調&#xff09; 辦理入職&#xff08;簽合同&#xff09; 入職培訓 試用期 轉正 【簡歷要點】 1.基本信息 學校專業&#xff…

C盤清理技巧分享:釋放空間,提升電腦性能

目錄 1. 引言 2. C盤空間不足的影響 3. C盤清理的必要性 4. C盤清理的具體技巧 4.1 刪除臨時文件 4.2 清理系統還原點 4.3 卸載不必要的程序 4.4 清理下載文件夾 4.5 移動大文件到其他盤 4.6 清理系統緩存 4.7 使用磁盤清理工具 4.8 清理Windows更新文件 4.9 禁用…

rpm安裝nux-dextop時出現 epel-release is needed的解決方案

大家好,我是愛編程的喵喵。雙985碩士畢業,現擔任全棧工程師一職,熱衷于將數據思維應用到工作與生活中。從事機器學習以及相關的前后端開發工作。曾在阿里云、科大訊飛、CCF等比賽獲得多次Top名次。現為CSDN博客專家、人工智能領域優質創作者。喜歡通過博客創作的方式對所學的…

qt加載VeloView工程

接上一篇點云軟件配置與編譯&#xff0c;使用qt加載需要先完成編譯。編譯完成后到編譯目錄下lidarview-superbuild\common-superbuild\lidarview\build 找到CmakeCache.txt&#xff0c;如下是我的編譯目錄。 使用QT6.5.3加載了CmakeCache.txt&#xff0c;QT5.14還加載不了cmake…

python編寫的一個打磚塊小游戲

游戲介紹 打磚塊是一款經典的街機游戲&#xff0c;玩家控制底部的擋板&#xff0c;使球反彈以擊碎上方的磚塊。當球擊中磚塊時&#xff0c;磚塊消失&#xff0c;球反彈&#xff1b;若球碰到擋板&#xff0c;則改變方向繼續運動&#xff1b;若球掉出屏幕底部&#xff0c;玩家失…

git 基本常用操作,切換分支,合并分支

分支 two 查看所有分支 git branch 切換分支&#xff08;two&#xff09; git checkout two 創建并切換到新分支&#xff08;two&#xff09; git checkout -b two 提交當前代碼到到源分支 git push --set-upstream origin two 合并分支 1. 切換到目標分支 例如&#xff0c;…

【QT】事件系統入門——QEvent 基礎與示例

一、事件介紹 事件是 應用程序內部或者外部產生的事情或者動作的統稱 在 Qt 中使用一個對象來表示一個事件。所有的 Qt 事件均繼承于抽象類 QEvent。事件是由系統或者 Qt 平臺本身在不同的時刻發出的。當用戶按下鼠標、敲下鍵盤&#xff0c;或者是窗口需要重新繪制的時候&…

自然語言處理初學者指南

文章目錄 一、說明二、自然語言處理發展史2.1 最早的自然語言處理簡介2.2 歷史2.3 NLP 的早期工作 三、NLP的現代方法3.1 單詞編碼3.2 循環神經網絡3.3 強化學習3.4 深度學習 四、更進一步的方法 一、說明 對于初學者來說&#xff0c;自然語言處理的發展歷史非常有必要了解&am…

unittest vs pytest區別

unittest vs pytest 對比 ?unittest 像“手動擋汽車”&#xff1a;操作步驟多&#xff0c;規則嚴格&#xff0c;適合老司機。?pytest 像“自動擋汽車”&#xff1a;開起來輕松&#xff0c;功能強大&#xff0c;適合新手和高效開發。 區別點?unittest?&#xff08;你學過的&…

CT117E-M4 CubeMX與Keil5 MDK-ARM基礎配置

目錄 1.CubeMX構建項目 2.芯片時鐘配置 2.1 芯片引腳配置 2.2 時鐘樹配置 3.調試接口配置 4.項目管理器Project Manager配置 4.1 project 4.2 Code Generator 5. 生成代碼 6.MDK_ARM配置 6.1 編譯器選擇 ?6.2 調試器配置 7. 創建本地代碼文件夾 8. #include 路徑…

MySQL中有哪幾種鎖?

大家好&#xff0c;我是鋒哥。今天分享關于【MySQL中有哪幾種鎖&#xff1f;】面試題。希望對大家有幫助&#xff1b; MySQL中有哪幾種鎖&#xff1f; 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 在MySQL中&#xff0c;鎖是用來控制并發訪問的機制&#xff0c;確…

MongoDB 和 Elasticsearch的區別、優缺點對比,以及選型建議

MongoDB 和 Elasticsearch 在存儲和搜索方面各有特點&#xff0c;適用于不同的場景。以下是它們的區別、優缺點對比&#xff0c;以及選型建議。 1. 概述 MongoDB&#xff1a;分布式 NoSQL 文檔數據庫&#xff0c;基于 BSON&#xff08;類似 JSON&#xff09;的文檔存儲&#x…

55.HarmonyOS NEXT 登錄模塊開發教程(九):部署與發布

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; HarmonyOS NEXT 登錄模塊開發教程&#xff08;九&#xff09;&#xff1a;部署與發布 效果預覽 1. 引言 在前八篇教程中&#xff0c;我們介紹了H…

vue3實現跨頁面緩存

避免頻繁向后端發送請求,vue3中,可以用緩存機制,為了實現跨頁面緩存,可以把緩存放到localsotrage里面 關鍵代碼: const globalCache JSON.parse(localStorage.getItem(globalCache)) || {}; 然后加一個forceRefresh關鍵字, const fetchData async (forceRefresh false) …

c++類和對象(下篇)上

今天又重新回到c的學習中~在前兩篇博客中,我簡單的學習了類的定義,實例化,以及類中的默認成員函數.下篇是類和對象的收尾篇,在這篇中我將補充一下中篇所講的構造函數以及介紹一些類和對象的新知識.下面讓我們開始學習吧. 再談構造函數 在之前我們實現構造函數時,初始化成員變量…

深度學習 bert流程

Token IDs 在自然語言處理任務中&#xff0c;特別是使用預訓練模型如BERT時&#xff0c;文本首先通過一個分詞器&#xff08;例如 BertTokenizer&#xff09;轉換為一系列的token IDs。這些ID是每個詞或子詞單元在詞匯表&#xff08;包含漢字、英文單詞、標點符號&#xff09;…

PPT內視頻播放無法播放的原因及解決辦法

PPT內視頻無法播放&#xff0c;通常是視頻編解碼的問題。目前我遇到的常見的視頻編碼格式有H.264&#xff0c;H.265&#xff0c;VP9&#xff0c;AV1這4種。H.264編解碼的視頻&#xff0c;Windows原生系統可以直接播放&#xff0c;其他的視頻編碼格式需要安裝對應的視頻編解碼插…

星越L_行李艙空間拓展講解

目錄 1.儲物槽 2.底板蓋儲物空間 3.掛鉤 3.左側照明燈 4.第二排座椅放倒 1.儲物槽 使用鑰匙或者后備箱按鈕打開電動后備箱,左側儲物槽可儲藏物品。 2.底板蓋儲物空間 打開地板蓋,下方有儲物空間。并放置了隨車工具。 3.掛鉤 后備箱左右兩測各有一個掛鉤。