【設計模式】模板模式

簡介
假設你要沖泡咖啡和茶,兩者的流程相似但部分步驟不同:

  1. 燒水(公共步驟)
  2. 加入主材料(咖啡粉/茶葉)
  3. 添加調料(糖/牛奶)→ 可選步驟
  4. 倒進杯子(公共步驟)

模板模式的作用

  • 在父類中定義沖泡飲料的固定流程(如燒水、倒杯),子類只需實現差異步驟(如加咖啡粉或茶葉)。
  • 避免重復代碼,同時允許靈活擴展(如是否加調料)。

適用場景

  • 多個類有相同流程,但某些步驟實現不同(如數據處理、文件解析)。
  • 需要控制子類的擴展點(如鉤子方法)。

優點

  • 代碼復用:公共邏輯在父類實現。
  • 靈活擴展:子類只需關注差異步驟。

缺點

  • 父類定義流程,子類可能被限制靈活性。
  • 容易因父類修改影響所有子類。

代碼
// 抽象模板類:定義飲料沖泡流程
abstract class BeverageTemplate {// 模板方法(final 防止子類覆蓋)public final void prepareBeverage() {boilWater();brew();addCondiments(); // 鉤子方法(可選步驟)pourInCup();}// 公共步驟private void boilWater() {System.out.println("燒水");}private void pourInCup() {System.out.println("倒進杯子");}// 抽象方法:子類必須實現protected abstract void brew();// 鉤子方法(默認不添加調料,子類可選覆蓋)protected void addCondiments() {}
}// 具體子類:咖啡
class Coffee extends BeverageTemplate {protected void brew() {System.out.println("加入咖啡粉");}@Overrideprotected void addCondiments() {System.out.println("加糖和牛奶");}
}// 具體子類:茶
class Tea extends BeverageTemplate {protected void brew() {System.out.println("加入茶葉");}
}// 客戶端代碼
public class Client {public static void main(String[] args) {BeverageTemplate coffee = new Coffee();coffee.prepareBeverage();// 輸出:// 燒水 → 加入咖啡粉 → 加糖和牛奶 → 倒進杯子BeverageTemplate tea = new Tea();tea.prepareBeverage();// 輸出:// 燒水 → 加入茶葉 → 倒進杯子}
}
類圖

在這里插入圖片描述

@startuml
abstract class BeverageTemplate {+ prepareBeverage(): void- boilWater(): void- pourInCup(): void# brew(): void# addCondiments(): void
}class Coffee {# brew(): void# addCondiments(): void
}class Tea {# brew(): void
}BeverageTemplate <|-- Coffee
BeverageTemplate <|-- Tea
@enduml

場景
數據庫連接、執行SQL、關閉連接的固定流程。

// 抽象模板類
public abstract class JdbcTemplate {// 模板方法public final void execute() {connect();String sql = buildSql(); // 抽象方法executeSql(sql);close();}private void connect() {System.out.println("連接數據庫");}private void executeSql(String sql) {System.out.println("執行SQL: " + sql);}private void close() {System.out.println("關閉連接");}protected abstract String buildSql();
}// 具體子類:用戶查詢
class UserQuery extends JdbcTemplate {protected String buildSql() {return "SELECT * FROM users";}
}// 具體子類:訂單插入
class OrderInsert extends JdbcTemplate {protected String buildSql() {return "INSERT INTO orders VALUES (...)";}
}// 客戶端代碼
public class DatabaseClient {public static void main(String[] args) {JdbcTemplate userQuery = new UserQuery();userQuery.execute();// 輸出:// 連接數據庫 → 執行SQL: SELECT * FROM users → 關閉連接JdbcTemplate orderInsert = new OrderInsert();orderInsert.execute();// 輸出:// 連接數據庫 → 執行SQL: INSERT INTO orders... → 關閉連接}
}

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

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

相關文章

【學Rust寫CAD】37 premultiply 函數(argb.rs補充方法)

源碼 fn premultiply(self) -> Argb {//預乘// This could be optimized by using SWARlet a self.alpha32();if a < 255 {Argb::new32(a, div255(self.red32() * a), div255(self.green32() * a),div255(self.blue32() * a))}else{self}源碼分析 這個函數實現了顏色預…

Redis-一般操作

1.redis命令CRUG網站 2.string 、 hash 、list 、 set 、zset 3.4種應用(對象存儲、累加器、分布式鎖、位運算) 1.redis命令CRUG網站 2string 、 hash 、list 、 set 、zset 3.4種應用(對象存儲、累加器、分布式鎖、位運算) 1.redis命令CRUG網站 #1.啟動redis redis-server r…

Vue 基礎語法介紹

Vue.js 是一個漸進式的 JavaScript 框架&#xff0c;廣泛用于構建用戶界面和單頁應用&#xff08;SPA&#xff09;。它的核心思想是通過簡單的模板語法和響應式的數據綁定機制&#xff0c;使得開發者能夠更直觀地創建動態交互的網頁。本文將介紹 Vue.js 的一些基礎語法&#xf…

Flask + Pear Admin Layui 快速開發管理后臺

框架介紹 Flask 就不用過多介紹了, Pear Admin Layui 是基于 Layui 的一套管理后臺前端開源模板, 主打一個開箱即用, 對于不喜歡 React/Vue 等這些還需要大量學習成本的前端開發者來說, 可以說是相當友好了. 項目官網: https://gitee.com/pear-admin/pear-admin-layui 項目的作…

git push

在 git push 命令中&#xff0c;分支名稱的順序和含義非常重要。其基本格式如下&#xff1a; git push <remote> <local_branch>:<remote_branch>各部分解釋 <remote>&#xff1a;遠程倉庫的名稱&#xff08;如 origin&#xff09;。<local_branc…

wordpress 利用 All-in-One WP Migration全站轉移

導出導入站點 在插件中查詢 All-in-One WP Migration備份并導出全站數據 導入 注意事項&#xff1a; 1.導入部分限制50MB 寶塔解決方案&#xff0c;其他類似&#xff0c;修改php.ini配置文件即可 2. 全站轉移需要修改域名 3. 大文件版本&#xff0c;大于1G的可以參考我的…

藍橋杯補題

方法技巧&#xff1a; 1.進行循環暴力騙分&#xff0c;然后每一層的初始進行判斷&#xff0c;如果已經不滿足題意了&#xff0c;那么久直接continue&#xff0c;后面的循環就不用浪費時間了。我們可以把題目所給的等式&#xff0c;比如說有四個未知量&#xff0c;那么我們可以用…

MySQL:鎖

按粒度分類 全局鎖 含義&#xff1a;全局鎖會鎖定整個數據庫實例&#xff0c;在其生效期間&#xff0c;其他事務無法對數據庫進行任何讀寫操作。常用于數據遷移、數據備份場景。 表級鎖 表鎖&#xff1a;是對整張表進行鎖定的機制。實現邏輯簡單&#xff0c;加鎖和釋放鎖速…

數字政府政務服務領域智能化應用解決方案

數字政府政務服務領域智能化應用 解決方案 一、方案背景 在數字經濟蓬勃發展的當下&#xff0c;數字化轉型已成為政府提升治理能力、優化公共服務、增強競爭力的關鍵路徑。黨的十九屆四中全會明確提出 “推進數字政府建設”&#xff0c;這為政府的數字化轉型指明了方向。 隨…

03--Deepseek服務器部署與cjson解析

一、ollama部署deepseek模型 1、Ollama 是一個開源的本地大語言模型運行框架&#xff0c;專為在本地機器上便捷部署和運行大型語言模型&#xff08;LLM&#xff09;而設計。 Ollama 教程&#xff1a;從 0 到 1 全面指南 教程【全文兩萬字保姆級詳細講解】 -CSDN博客 1.下載o…

棧(算法)

在 C 里&#xff0c;棧是一種遵循后進先出&#xff08;LIFO&#xff09;原則的數據結構。下面從多個方面為你介紹 C 棧&#xff1a; 1. 使用標準庫中的std::stack C 標準庫提供了std::stack容器適配器&#xff0c;能方便地實現棧的功能。以下是簡單示例&#xff1a; cpp #in…

UniApp 頁面布局自定義頭部導航

動態計算頭部高度與內容偏移量&#xff1a;實現 UniApp 頁面布局的精準適配 在移動端應用開發中&#xff0c;頁面布局的精準適配是一個關鍵問題。尤其是在 UniApp 中&#xff0c;不同設備的屏幕尺寸、狀態欄高度以及頭部布局的差異&#xff0c;可能導致頁面內容錯位或顯示不全…

verilog學習--1、語言要素

先看一個例子 /*This is first Verilog progaram*/ timescale 1ns/1ns module HalfAdder(A,B,Sum,Carry);input A,B;output Sum, Carry; /**/assign #2 SumA^B;assign #5 CarryA&B&#xff1b; endmodule; Verilog以module為單位編寫&#xff0c;每個文件一個module&#…

AC 自動機 洛谷P3808 P3796 P5357

洛谷P3808 #include <bits/stdc.h> using namespace std; const int maxn 1e6 5; int ch[maxn][30], fa[maxn], End[maxn]; int cnt 0 , n; int get_num(char c){return c - a;} void build(string s){int cur 0, len s.length();for(int i 0; i < len; i){int…

C++藍橋杯實訓篇(二)

片頭 嗨咯~小伙伴們&#xff01;今天我們來一起學習算法和貪心思維&#xff0c;準備好了嗎&#xff1f;咱們開始咯&#xff01; 第1題 數位排序 對于這道題&#xff0c;我們需要自己寫一個排序算法&#xff0c;也就是自定義排序&#xff0c;按照數位從小到大進行排序。 舉一…

redisson常用加鎖方式

RLock lock redissonClient.getLock("lock:order:" order);和redissonDistributedLocker.tryLock("lock:order:" order&#xff0c; TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);這兩種加鎖方式的區別如下&…

Go 微服務框架 | 路由實現

文章目錄 不用框架實現web接口實現簡單的路由實現分組路由支持不同的請求方式支持同一個路徑的不同請求方式前綴樹應用前綴樹完善路由代碼 不用框架實現web接口 // blog main.go 文件 package mainimport ("fmt""log""net/http" )func main() {…

zabbix中通過模板實現自動發現對tcp端口批量監控

主要為了解決監控大量端口&#xff0c;避免繁瑣的重復操作監控項和觸發器 諸位~ 僅供參考哈 自動發現監控參考地址: https://blog.csdn.net/qq_37510195/article/details/130893655 模板 首先創建一個模板 自定義名稱和群組 創建自動發現規則 模板——自動發現——創建發現規則…

Mysql備忘記錄

1、簡介 Mysql操作經常忘記命令&#xff0c;本文將持續記錄Mysql一些常用操作。 2、常見問題 2.1、忘記密碼 # 1、首先停止Mysql服務 systemctl stop mysqld # windows 從任務管理器里面停 # 2、更改配置文件 my.cnf (windows是 ini文件) vim /etc/my.cnf 在[mysqld]下面添…

【藍橋杯】15屆JAVA研究生組F回文字符串

一、思路 1.這題去年考的時候想的是使用全排列進行嘗試&#xff0c;實際不用這么麻煩&#xff0c;只用找到第一個和最后一個非特殊字符串的位置&#xff0c;然后分別向內檢查是否對稱&#xff0c;向外檢查是否對稱直到左指針小于0(可以通過添加使其對稱) 2.至于如何找到第一個…