談談模板方法模式,模板方法模式的應用場景是什么?

一、模式核心理解

模板方法模式是一種??行為設計模式??,通過定義算法骨架并允許子類重寫特定步驟來實現代碼復用。

如同建筑圖紙規定房屋結構,具體裝修由業主決定,該模式適用于??固定流程中需要靈活擴展??的場景。

// 基礎請求處理類(模板)
class BaseRequestHandler {// 模板方法(禁止override)async execute() {this.validateParams();const processed = await this.processRequest();this.afterProcess();return this.createResponse(processed);}validateParams() {throw new Error("必須實現參數校驗方法");}// 鉤子方法(可選實現)afterProcess() {}
}// 具體API請求實現
class UserAPIHandler extends BaseRequestHandler {validateParams() {if (!this.params.userId) throw "用戶ID必填";}async processRequest() {return await fetch(`/users/${this.params.userId}`);}createResponse(data) {return { status: 200, data };}
}// 使用示例
const handler = new UserAPIHandler({ userId: 123 });
handler.execute();

二、典型應用場景

1. 框架生命周期控制

// React類組件示例
class BaseComponent extends React.Component {// 模板方法componentDidMount() {this.initState();this.fetchData();this.bindEvents();}initState() {}       // 子類實現fetchData() {}       // 子類實現bindEvents() {}      // 默認空實現(鉤子方法)
}class UserList extends BaseComponent {initState() {this.setState({ users: [] });}fetchData() {axios.get('/api/users').then(res => this.setState({ users: res.data }));}
}

2. 表單校驗系統

class FormValidator {validate(formData) {this.checkRequiredFields(formData);const customResult = this.customValidation(formData);return this.formatResult(customResult);}checkRequiredFields(formData) {// 通用必填校驗邏輯}customValidation() {throw new Error("必須實現具體校驗規則");}formatResult(result) {return { isValid: result, timestamp: Date.now() };}
}class LoginFormValidator extends FormValidator {customValidation(formData) {return formData.password.length >= 8;}
}

三、使用建議

  1. ??流程標準化??:支付流程(風控檢查->創建訂單->調用支付->結果處理)
class PaymentProcessor {async pay(amount) {this.riskCheck();const order = this.createOrder(amount);const result = await this.callPaymentGateway(order);return this.handleResult(result);}// ...抽象方法聲明
}
  1. ??合理使用鉤子??:在報表生成器中設置可選步驟
class ReportGenerator {generate() {this.fetchData();this.beforeRender(); // 鉤子方法this.renderHeader();this.renderBody();}beforeRender() {} // 默認空實現
}
  1. ??組合優于繼承??:對于復雜場景建議使用策略模式+模板方法
class DataExporter {constructor(formatter) {this.formatter = formatter;}export() {const raw = this.getData();return this.formatter(raw);}
}

四、注意事項

  1. ??避免流程碎片化??(錯誤示例)
// 反模式:過度拆分步驟
class BadTemplate {execute() {this.step1();this.step2();this.step3();this.step4();// 20+步驟...}
}
  1. ??子類責任邊界??
class OrderProcessor extends BaseProcessor {validate() {// 不要修改執行順序super.validate(); // 必須調用父類方法this.checkInventory(); // 擴展校驗}
}
  1. ??模板方法凍結??
class SecureBase {execute() {Object.freeze(this.execute); // 防止子類重寫模板方法// ...執行流程}
}

五、總結

模板方法模式在前端開發中適合處理??流程固定但實現可變??的場景,如請求處理、表單校驗、生命周期管理等。使用時要注意:

  1. 保持模板方法穩定,通過鉤子方法擴展
  2. 子類實現不超過3層繼承
  3. 復雜場景結合策略模式使用
  4. 使用TypeScript時聲明抽象方法
// TypeScript實現示例
abstract class UIComponent {abstract render(): void;mount() {this.willMount();this.render();this.didMount();}protected willMount() {}protected didMount() {}
}

正確使用模板方法模式可以提升代碼復用率30%以上,但需根據實際場景靈活選擇實現方式。

在微前端架構中,該模式常用于基座應用與子應用的生命周期管理,建議結合具體業務需求進行合理設計。

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

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

相關文章

2024 Jiangsu Collegiate Programming Contest H

記錄一下為數不多的網絡流 #pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc.h> #include <execution> using namespace std; using i64 long long; using i128 __int128;template <typename T>struct MCFgraph{struct …

Hadoop序列化與反序列化

一、Hadoop序列化概述 &#xff08;一&#xff09;什么是序列化和反序列化 序列化&#xff1a;序列化是將對象&#xff08;如Java中的類實例&#xff09;轉換為字節序列的過程。在Hadoop中&#xff0c;數據在分布式系統中傳輸或者存儲到磁盤時&#xff0c;需要將數據對象序列…

FreeRTOS臨界區

在FreeRTOS中&#xff0c;臨界區通過關閉可管理的中斷來保護共享資源&#xff0c;具體關閉的中斷層級由configMAX_SYSCALL_INTERRUPT_PRIORITY宏定義決定。以下是關鍵點解析&#xff1a; 中斷優先級分類&#xff1a; 高優先級中斷&#xff1a;數值低于configMAX_SYSCALL_INTERR…

cdw2: TypeScript

一、javascript的問題 二、初識typescript https://mp.weixin.qq.com/s/wnL1l-ERjTDykWM76l4Ajw 三、類型 二進制&#xff1a;ob開頭&#xff0c;八進制&#xff1a;0o開頭&#xff0c;十六進制&#xff1a;0x開頭 開發中不這樣寫 這樣寫 匿名函數的參數最好不要…

Qt中的元對象系統

Qt的元對象系統(Meta-Object System)提供了對象間通信的信號和槽機制、運行時類型信息和動態屬性系統。 元對象系統基于以下三個方面&#xff1a; (1).QObject類&#xff1a;為可以利用元對象系統的對象提供了基類。 (2).Q_OBJECT宏&#xff1a;用于啟用元對象功能&#xff0c;…

深入理解重排(Reflow)與重繪(Repaint),寫出高性能 CSS 動畫

在前端開發中&#xff0c;CSS 動畫是提升用戶體驗的重要手段&#xff0c;但很多開發者在使用動畫時并不了解瀏覽器背后的渲染機制&#xff0c;導致動畫卡頓甚至影響整體性能。本文將帶你深入理解 CSS 中的兩大核心概念 —— 重排&#xff08;Reflow&#xff09; 與 重繪&#x…

<貪心算法>

前言&#xff1a;在主包還沒有接觸算法的時候&#xff0c;就常聽人提起“貪心”&#xff0c;當時是layman&#xff0c;根本不知道說的是什么&#xff0c;以為很難呢&#xff0c;但去了解一下&#xff0c;發現也不過如此嘛&#xff08;bushi)&#xff0c;還以為是什么高級東西呢…

大模型快速 ASGI 服務器uvicorn

基礎概念類 1. 什么是 Uvicorn&#xff0c;它的作用是什么&#xff1f; 答案&#xff1a;Uvicorn 是一個基于 Python 的快速 ASGI&#xff08;異步服務器網關接口&#xff09;服務器。它的主要作用是作為 Web 應用程序的服務器&#xff0c;負責接收客戶端的請求&#xff0c;并…

2025高頻面試算法總結篇【二叉樹】

文章目錄 直接刷題鏈接直達非遞歸實現求二叉樹的深度非遞歸從左至右打印一顆二叉樹中的所有路徑判斷平衡二叉樹二叉搜索樹中第K小的元素二叉樹的完全性檢驗根據前&中序遍歷結果重建二叉樹二叉樹的最近公共祖先二叉樹的直徑二叉樹的遍歷 直接刷題鏈接直達 非遞歸實現求二叉…

redis 和 MongoDB都可以存儲鍵值對,并且值可以是復雜json,用完整例子分別展示說明兩者在存儲json鍵值對上的使用對比

Redis 存儲 JSON 鍵值對示例 存儲操作&#xff1a; // 存儲用戶信息&#xff08;鍵&#xff1a;user:1001&#xff0c;值&#xff1a;JSON對象&#xff09; SET user:1001 {"name":"Alice", "age":30, "address":"New York&quo…

介紹幾種創意登錄頁(含完整源碼)

今天為大家收集了幾種不同風格的登錄頁&#xff0c;搭配動態漸變背景&#xff0c;效果絕對驚艷&#xff01; CSS3實現動態漸變玻璃擬態登錄頁 一、開篇語 純CSS實現當下最火的玻璃擬態(Morphism)風格登錄頁&#xff0c;搭配動態漸變背景&#xff0c;效果絕對驚艷&#xff01; …

R語言之mlr依賴包缺失警告之分析

因為本地沒有網絡&#xff0c;所有相關的依賴包都是手動下載&#xff0c;再使用腳本一鍵安裝的。 在使用mlr包時&#xff0c;執行下面的代碼時&#xff0c;總是報各種依賴缺失&#xff0c;也不知道咋看FAIL信息。 # 建模與調參 # 查閱線性回歸、隨機森林、xgboost和KNN四種模…

無狀態版的DHCPv6是不是SLAAC? 筆記250405

無狀態版的DHCPv6是不是SLAAC? 筆記250405 無狀態版 DHCPv6 不是 SLAAC&#xff0c;但二者在 IPv6 網絡中可協同工作。以下是核心區別與協作關系&#xff1a; 本質區別 特性SLAAC無狀態 DHCPv6主要功能生成 IPv6 地址&#xff08;基于路由器通告的前綴&#xff09;分發 DNS、…

uniapp微信小程序地圖marker自定義氣泡 customCallout偶爾顯示不全解決辦法

這個天坑問題&#xff0c;在微信開發工具上是不會顯示出來的,只有在真機上才會偶爾出現隨機樣式偏移/裁剪/寬長偏移&#xff0c;詢問社區也只是讓你提交代碼片段&#xff0c;并無解決辦法。 一開始我懷疑是地圖組件加載出現了問題&#xff0c;于是給地圖加了一個v-if"reL…

LabVIEW商業軟件開發注意問題

在 LabVIEW 商業軟件開發進程中&#xff0c;性能優化、界面設計及兼容性與擴展性&#xff0c;對軟件品質、用戶體驗和市場適配性起著決定性作用。下面&#xff0c;借助多個LabVIEW 編程特性的實際案例&#xff0c;深入分析這些方面的開發要點。 一、性能優化&#xff1a;提升軟…

Ubuntu 安裝 VLC

最近項目中需要用VLC查看NVR下子設備的RTSP流&#xff0c;特此記錄&#xff0c;便于日后查閱。 1、安裝snap $ sudo apt update $ sudo apt install snapd 2、安裝vlc $ sudo snap install vlc 3、可能遇到的問題 snap beta install on ubuntu 22.04 failing to start Qt: Se…

LeetCode 3047 求交集區域內的最大正方形面積

探尋矩形交集中的最大正方形面積 在算法與數據結構的探索之路上&#xff0c;二維平面幾何問題一直占據著獨特的地位&#xff0c;它們不僅考驗我們的空間思維能力&#xff0c;還要求我們能夠巧妙地運用算法邏輯。今天&#xff0c;我們將深入剖析一道極具代表性的二維平面幾何算…

【Kafka基礎】Kafka 2.8以下版本的安裝與配置指南:傳統ZooKeeper依賴版詳解

對于仍在使用Kafka 2.8之前版本的團隊來說&#xff0c;需要特別注意其強依賴外部ZooKeeper的特性。本文將完整演示傳統架構下的安裝流程&#xff0c;并對比新舊版本差異。 1 版本特性差異說明 1.1 2.8 vs 2.8-核心區別 特性 2.8版本 2.8-版本 協調服務 可選內置KRaft模式 …

springboot+easyexcel實現下載excels模板下拉選擇

定義下拉注解 Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface ExcelDropDown {/*** 固定下拉選項*/String[] source() default {};/*** 動態數據源key&#xff08;從上下文中獲取&#xff09;*/String sourceMethod() default "";…

第15周:注意力匯聚:Nadaraya-Watson 核回歸

注意力匯聚&#xff1a;Nadaraya-Watson 核回歸 Nadaraya-Watson 核回歸是一個經典的注意力機制模型&#xff0c;它展示了如何通過注意力權重來對輸入數據進行加權平均。以下是該內容的核心總結&#xff1a; 關鍵概念 注意力機制框架&#xff1a;由查詢&#xff08;自主提示…