談談策略模式,策略模式的適用場景是什么?

一、什么是策略模式???

策略模式(Strategy Pattern)屬于??行為型設計模式??。核心思路是將一組??可替換的算法??封裝在獨立的類中,使它們可以在運行時動態切換,同時使客戶端代碼與具體算法解耦。它包含三個核心角色:

  1. ??策略接口(Strategy Interface)??:定義算法的方法簽名
  2. ??具體策略(Concrete Strategies)??:實現具體算法邏輯
  3. ??上下文(Context)??:持有一個策略對象,并調用其方法

??通俗比喻??:把算法當作「插件」,客戶端只需要選擇對應插件插入到主流程中,不需要關注插件內部實現。


??二、適用場景??

_以下場景常見于前端開發:_

  1. ??同類功能的多算法切換??
    👉 表單驗證(郵箱、手機號、身份證等校驗規則)、數據導出(CSV、Excel、PDF格式)、圖表渲染(折線圖、柱狀圖)
  2. ??需要動態選擇行為的場景??
    👉 動態折扣計算(滿減、折扣券、積分抵扣)、權限校驗(不同角色對應不同校驗規則)
  3. ??消除臃腫的條件分支??
    👉 存在大量?if-else?或?switch-case?的場景(如老代碼中的支付方式處理)
  4. ??需要隱藏復雜算法的實現??
    👉 地圖路徑規劃(步行、駕車、公交策略)、動畫緩動函數(linear、ease-in)

??三、實戰代碼示例??
??案例1:表單驗證策略??
// 策略接口:定義 validate 方法
class ValidationStrategy {validate(value) {throw new Error("必須實現 validate 方法!");}
}// 具體策略:非空校驗
class RequiredValidation extends ValidationStrategy {validate(value) {return value.trim() !== "";}
}// 具體策略:手機號校驗
class MobileValidation extends ValidationStrategy {validate(value) {return /^1[3-9]\d{9}$/.test(value);}
}// 上下文類:管理當前策略
class ValidatorContext {constructor(strategy) {this.strategy = strategy;}setStrategy(strategy) {this.strategy = strategy;}execute(value) {return this.strategy.validate(value);}
}// 使用示例
const validator = new ValidatorContext(new RequiredValidation());
console.log(validator.execute("")); // 輸出 falsevalidator.setStrategy(new MobileValidation());
console.log(validator.execute("13800138000")); // 輸出 true

??代碼亮點??:

  • 添加新校驗規則只需新增策略類,無須修改?ValidatorContext
  • 客戶端通過?.setStrategy()?動態切換算法

??案例2:動態數據導出(常用功能增強)??
// 策略接口:導出方法
class ExportStrategy {export(data) {throw new Error("必須實現 export 方法");}
}// 具體策略-導出為 CSV
class CsvExport extends ExportStrategy {export(data) {const csvContent = data.map(row => row.join(",")).join("\n");console.log(`導出 CSV 成功,內容:${csvContent}`);}
}// 具體策略-導出為 Excel(偽代碼)
class ExcelExport extends ExportStrategy {export(data) {// 假裝調用了 Excel 庫console.log("生成 Excel 文件并下載");}
}// 上下文(可與 UI 結合)
class Exporter {constructor() {this.strategy = new CsvExport(); // 默認策略}setFormat(format) {if (format === 'csv') {this.strategy = new CsvExport();} else if (format === 'excel') {this.strategy = new ExcelExport();}}executeExport(data) {this.strategy.export(data);}
}// 使用示例
const exporter = new Exporter();
exporter.setFormat('excel');
exporter.executeExport([['Name', 'Age'], ['John', 30]]);

??應用場景??:
不同導出格式的代碼集中到策略類中,避免主模塊代碼混亂。


??四、開發建議與避坑指南??
??推薦做法??:
  1. ??組合優于繼承??:
    用策略對象組合到上下文類,而非通過繼承實現多態
  2. ??接口約束??:TypeScript 更優
    interface Strategy {execute(data: any): void;
    }
  3. ??策略命名清晰??:
    用?MobileValidationStrategy?而非?Strategy1,便于維護
  4. ??無狀態策略??:
    盡量將策略設計為無狀態(純函數),可通過單例復用
??常見陷阱??:
  1. ??過度設計??:
    👉 若只有1~2種固定算法,直接?if-else?更簡單
  2. ??客戶端感知策略細節??:
    👉 違反迪米特法則,應當由上下文類處理策略選擇
  3. ??策略間參數不一致??:
    👉 校驗策略統一接收字符串,而非有的需要?value,有的需要?formData
  4. ??性能損耗??:
    👉 頻繁創建策略對象時,可考慮對象池緩存
?

策略模式是應對??算法多樣化??和??動態切換需求??的強大工具,前端開發中使用頻率較高。

正確使用可顯著提升代碼可維護性,但在簡單場景下需權衡是否引入復雜度。關鍵在于??識別行為的變化點??,將其獨立出來。

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

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

相關文章

AGI大模型(10):prompt逆向-巧借prompt

1 提示詞逆向 明確逆向提示詞?程概念 我們可以給ChatGPT提供?個簡潔的提示詞,讓它能夠更準確地理解我們所討論的“逆向提示詞?程”是什么意思,并通過這個思考過程,幫它將相關知識集中起來,進?構建?個專業的知識領域 提示詞:請你舉?個簡單的例?,解釋?下逆向pro…

IntelliJ IDEA全棧Git指南:從零構建到高效協作開發

文章目錄 摘要 正文一、環境搭建:5分鐘完成Git與IDEA的深度綁定二、基礎操作:IDEA如何將Git效率提升300%三、分支管理:高并發團隊的協作秘籍四、強制覆蓋:高風險操作的生存指南五、實戰避坑:血淚經驗總結六、基于老項目…

指針的補充(用于學習筆記的記錄)

1.指針基礎知識 1.1 指針變量的定義和使用 指針也是一種數據類型&#xff0c;指針變量也是一種變量 指針變量指向誰&#xff0c;就把誰的地址賦值給指針變量 #include<stdio.h>int main() {int a 0;char b 100;printf("%p,%p \n", &a,&b); // …

【Cursor/VsCode】在文件列表中不顯示.meta文件

打開設置文件 教程&#xff1a;【Cursor】打開Vscode設置 在settings.json里配置這個&#xff1a; "files.exclude": {"**/*.meta": true }

React-Diffing算法和key的作用

1.驗證Diffing算法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </he…

Linux文件操作命令詳解

各類資料學習下載合集 ??https://pan.quark.cn/s/8c91ccb5a474?? 在Linux操作系統中,文件操作命令是用戶與系統交互的重要工具。掌握這些命令能夠高效地管理文件和目錄。本文將詳細介紹常用的Linux文件操作命令,包括它們的用法、選項、具體示例及運行結果。 1. 查看文…

Redisson使用詳解

一、Redisson 核心特性與適用場景 Redisson 是基于 Redis 的 Java 客戶端&#xff0c;提供分布式對象、鎖、集合和服務&#xff0c;簡化分布式系統開發。 典型應用場景&#xff1a; 分布式鎖&#xff1a;防止重復扣款、超賣控制&#xff08;如秒殺庫存&#xff09;。數據共享…

從代碼學習深度學習 - GRU PyTorch版

文章目錄 前言一、GRU模型介紹1.1 GRU的核心機制1.2 GRU的優勢1.3 PyTorch中的實現二、數據加載與預處理2.1 代碼實現2.2 解析三、GRU模型定義3.1 代碼實現3.2 實例化3.3 解析四、訓練與預測4.1 代碼實現(utils_for_train.py)4.2 在GRU.ipynb中的使用4.3 輸出與可視化4.4 解析…

Flask學習筆記 - 項目結構 + 路由

前言 待業家中繼續學習。 Flask 項目結構 my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── routes/ -- 將不同功能模塊的路由分開管理 │ │ ├── __init__.py │ │ ├── main.py -- 主模塊的路由 │ │ └── auth.py -- 認證相關的路…

SQL 轉 PHP Eloquent、Doctrine ORM, 支持多數據庫

SQL 轉 PHP 說明 在 PHP 開發中&#xff0c;常使用 ORM&#xff08;如 Eloquent、Doctrine&#xff09;操作數據庫。手寫 ORM 模型繁瑣&#xff0c;gotool.top 提供 SQL 轉 PHP 工具&#xff0c;可自動生成 PHP 代碼&#xff0c;提高開發效率。 特色 支持 Laravel Eloquent …

【Python】Python 環境 + Pycharm 編譯器 官網免費下載安裝(圖文教程,新手安裝,Windows 10 系統)

目錄 Python 環境的下載安裝第一步 進入官網第二步 找到匹配 windows 系統的 python 下載頁面第三步 根據電腦 cpu 架構選擇 python 版本第四步 安裝 python 環境第五步 驗證 python 環境變量 Pycharm 的下載安裝第一步 進入官網第二步 安裝 Pycharm Community Edition第三步 第…

基于javaweb的SpringBoot圖片管理系統圖片相冊系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

局域網:電腦或移動設備作為主機實現局域網訪問

電腦作為主機 1. 啟用電腦的網絡發現、SMB功能 2. 將訪問設備開啟WIFI或熱點&#xff0c;用此電腦連接&#xff1b;或多臺設備連接到同一WIFI 3. 此電腦打開命令行窗口&#xff0c;查看電腦本地的IP地址 Win系統&#xff1a;輸入"ipconfig"&#xff0c;回車后如圖 4.…

use_tempaddr 筆記250405

use_tempaddr 筆記250405 use_tempaddr 是 Linux 系統中用于控制 IPv6 臨時隱私地址生成策略 的關鍵參數。以下是其詳細說明&#xff1a; &#x1f4dc; 參數定義 路徑&#xff1a; /proc/sys/net/ipv6/conf/<接口>/use_tempaddr默認值&#xff1a; 1&#xff08;大多數…

NO.66十六屆藍橋杯備戰|基礎算法-貪心-區間問題|凌亂的yyy|Rader Installation|Sunscreen|牛欄預定(C++)

區間問題是另?種?較經典的貪?問題。題??對的對象是?個?個的區間&#xff0c;讓我們在每個區間上做出取舍。 這種題?的解決?式?般就是按照區間的左端點或者是右端點排序&#xff0c;然后在排序之后的區間上&#xff0c;根據題?要求&#xff0c;制定出相應的貪?策略&…

用C語言控制鍵盤上的方向鍵

各位同學&#xff0c;大家好&#xff01;相信大家在學習C語言的過程中&#xff0c;都和我一樣&#xff0c;經常使用scanf函數來接受字符&#xff0c;數字&#xff0c;這些標準輸入信息&#xff0c;來實現自己設計的程序效果。 而我突然有一天&#xff08;對就是今天&#xff09…

特殊的質數肋骨--dfs+isp

1.dfs全排列組數&#xff0c;an記得還原 2.如果范圍確定且只比較質數&#xff0c;isp比線性篩快&#xff0c;主要這個范圍太大了 https://www.luogu.com.cn/problem/P1218 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typed…

定積分的應用(4.39-4.48)

battle cry 前言4.394.404.414.424.434.444.454.464.474.48 前言 題目確實比較多。slow down and take your time. 4.39 狂算了一遍&#xff0c;然后發現不是計算出問題了&#xff0c;是積分上下限寫錯了。還有把函數代進去也出了一點問題。 點火公式一家人我不記得&#x…

如何高效使用 Ubuntu 中文官方網站

Ubuntu 中文官方網站 一、快速導航與核心模塊 首頁焦點區 頂部菜單欄:快速訪問「下載」「文檔」「支持」「商店」等核心功能。輪播圖區:展示最新版本(如 Ubuntu 24.04 LTS)和特色功能(如 Ubuntu Pro 訂閱服務)。搜索框:支持中文關鍵詞搜索(如 "邊緣計算"),…

form實現pdf文件轉換成jpg文件

說明&#xff1a; 我希望將pdf文件轉換成jpg文件 請去下載并安裝 Ghostscript&#xff0c;gs10050w64.exe 配置環境變量&#xff1a;D:\Program Files\gs\gs10.05.0\bin 本地pdf路徑&#xff1a;C:\Users\wangrusheng\Documents\name.pdf 輸出文件目錄&#xff1a;C:\Users\wan…