模板方法模式:優雅封裝算法骨架

目錄

一、模板方法模式

1、結構

2、特性

3、優缺點

3.1、優點

3.2、缺點

4、使用場景

5、實現示例

5.1、抽象類

5.2、實現類

5.3、測試類


一、模板方法模式

模板方法模式(Template Method Pattern)是一種行為設計模式,它在一個方法中定義了一個算法的骨架,而將一些步驟的實現延遲到子類中。

通過這種方式,模板方法模式可以將步驟的執行順序控制在父類中,同時允許子類覆蓋特定步驟的實現以滿足具體需要。


1、結構

模板方法模式包含以下主要角色:

  1. 抽象類(Abstract Class)

    • 定義抽象的基本操作,子類將重定義它們以實現算法的特定步驟

    • 實現一個模板方法,定義算法的骨架

  2. 具體類(Concrete Class)

    • 實現基本操作以完成算法中與特定子類相關的步驟

2、特性

? ? 固定算法結構:模板方法通過定義算法的骨架,確保算法的固定執行順序。
? ? 可擴展步驟:子類可以覆蓋父類中定義的抽象方法,從而擴展或修改某些步驟,而不影響整體算法的結構。
? ? 不可變模板方法:模板方法通常使用 final 修飾,這樣子類就不能重寫這個方法,從而保證了算法骨架的穩定性。

3、優缺點


3.1、優點

? ? 代碼復用:通過在抽象類中定義公用的算法結構,可以減少代碼重復,提高代碼復用性。
? ? 靈活性和可擴展性:子類可以根據具體需求覆蓋抽象方法,從而實現不同的具體行為,這提高了系統的靈活性和可擴展性。
? ? 控制反轉:模板方法模式實現了一種變相的控制反轉,由父類調用子類實現的具體方法,減少了子類對父類的依賴。

3.2、缺點

? ? 過度設計:如果算法步驟很簡單或變化不大,使用模板方法模式可能導致過度設計,引入不必要的復雜性。
? ? 實現不直觀:模板方法模式涉及繼承和多態,對某些人來說可能不是特別直觀,需要詳細文檔說明才能正確理解和使用。

4、使用場景

  1. 一次性實現算法的不變部分,將可變部分留給子類實現

  2. 各子類中公共的行為應被提取出來集中到公共父類中

  3. 控制子類擴展,只允許在特定點進行擴展

5、實現示例


5.1、抽象類
?
/*** 抽象類 - 飲料制作模板* 定義了制作飲料的算法骨架*/
public abstract class BeverageTemplate {// 模板方法 - 定義制作飲料的步驟(算法骨架)public final void prepareBeverage() {boilWater();brew();pourInCup();if (customerWantsCondiments()) {addCondiments();}}// 具體方法 - 燒水(所有飲料都一樣)private void boilWater() {System.out.println("燒開水");}// 具體方法 - 倒入杯子(所有飲料都一樣)private void pourInCup() {System.out.println("將飲料倒入杯子");}// 抽象方法 - 沖泡(由子類實現)protected abstract void brew();// 抽象方法 - 添加調料(由子類實現)protected abstract void addCondiments();// 鉤子方法 - 顧客是否要加調料(默認返回true,子類可覆蓋)protected boolean customerWantsCondiments() {return true;}
}
5.2、實現類

具體子類 - 咖啡

/*** 具體子類 - 咖啡*/
public class Coffee extends BeverageTemplate {@Overrideprotected void brew() {System.out.println("沖泡咖啡粉");}@Overrideprotected void addCondiments() {System.out.println("加入糖和牛奶");}// 覆蓋鉤子方法 - 詢問用戶是否要加調料@Overrideprotected boolean customerWantsCondiments() {String answer = getUserInput();return answer.toLowerCase().startsWith("y");}}

具體子類 - 茶

/*** 具體子類 - 茶*/
public class Tea extends BeverageTemplate {@Overrideprotected void brew() {System.out.println("浸泡茶葉");}@Overrideprotected void addCondiments() {System.out.println("加入檸檬");}// 覆蓋鉤子方法 - 茶默認不加調料@Overrideprotected boolean customerWantsCondiments() {return false;}
}

5.3、測試類

public class BeverageTest {public static void main(String[] args) {System.out.println("======= 制作咖啡 =======");BeverageTemplate coffee = new Coffee();coffee.prepareBeverage();System.out.println("\n======= 制作茶 =======");BeverageTemplate tea = new Tea();tea.prepareBeverage();}
}

結果:

======= 制作咖啡 =======
燒開水
沖泡咖啡粉
將飲料倒入杯子
您的咖啡要加糖和牛奶嗎 (y/n)? y
加入糖和牛奶======= 制作茶 =======
燒開水
浸泡茶葉
將飲料倒入杯子

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

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

相關文章

韋東山STM32_HAl庫入門教程(SPI)學習筆記[09]內容

(1)SPI程序層次一、核心邏輯:“SPI Flash 操作” 是怎么跑起來的?要讀寫 SPI Flash,需同時理解 硬件連接(怎么接線) 和 軟件分層(誰負責發指令、誰負責控制邏輯)&#xf…

線上Linux服務器的優化設置、系統安全與網絡安全策略

一、Linux服務器的優化設置 線上Linux的優化配置序號基礎優化配置內容說明1最小化安裝系統【僅安裝需要的,按需安裝、不用不裝】,必須安裝的有基本開發環境、基本網絡包、基本應用包。2ssh登錄策略優化 Linux服務器上的ssh服務端配置文件是【/et…

基于人眼視覺特性的相關圖像增強基礎知識介紹

目錄 1. 傳統的灰度級動態范圍優化配置方法 2.基于視覺特性的灰度級動態范圍調整優化 1. 傳統的灰度級動態范圍優化配置方法 傳統的灰度級動態范圍調整方法主要包括線性動態范圍調整及非線性動態 范圍調整。線性動態范圍調整是最簡單的灰度級動態范圍調整方法,觀察…

Selenium使用超全指南

🍅 點擊文末小卡片 ,免費獲取軟件測試全套資料,資料在手,漲薪更快概述selenium是網頁應用中最流行的自動化測試工具,可以用來做自動化測試或者瀏覽器爬蟲等。官網地址為:相對于另外一款web自動化測試工具QT…

Go通道操作全解析:從基礎到高并發模式

一、channel類型 Go 語言中的通道(channel)是一種特殊的類型。它類似于傳送帶或隊列,遵循先進先出(FIFO)原則,確保數據收發順序的一致性。每個通道都是特定類型的導管,因此在聲明時必須指定其元素類型。 channel是一種類型, 一種引用類型。 聲明通道類型的格式如下:…

Linux網絡--1、網絡基礎

目錄 一、網絡發展 二、理解分層 2.1OSI七層模型 2.2TCP/IP分層模型 2.3分層的好處 三、認識協議 3.1初步認識 3.2了解指定組織 3.3具體協議理解 3.3.1是什么 3.3.2為什么 3.3.3與OS的關系 3.4總結 四、網絡傳輸流程 4.1局域網網絡傳輸 4.1.1通信過程 4.1.2概念解析 4.2跨網…

前端視角下關于 WebSocket 的簡單理解

參考 RFC 6455: The WebSocket Protocol WebSocket 協議基礎 協議本質:在單個 TCP 連接上提供全雙工通信通道的協議核心優勢: 雙向實時通信(服務器主動推送)低延遲(相比 HTTP 輪詢)高效數據傳輸&#xff0…

自動化一鍵部署 LNMP 環境

第一步:準備環境 & 準備腳本文件1. 你在 CentOS 7 的服務器/虛擬機里打開終端,確認你有 root 權限或者能用 sudo。輸入下面命令確認你的系統版本:cat /etc/centos-release你應該看到類似:CentOS Linux release 7.9.2009 (Core…

react之React.cloneElement()

react提供的這個方法克隆組件的方法,可能我們在平常的開發中用的很少,主要可能是我們并不知道或者并不了解這個方法。因為我在之前react的children文章中用到過,所以我就進行了一系列的測試,發現真的非常的好用。我們同樣使用一些…

學習Java的Day27

今天學習的主要內容是在IntelliJ IDEA開發環境中,通過部署Tomcat服務器并連接MySQL數據庫,實現了一個完整的留言板系統。這個項目涵蓋了前后端開發的全流程,具體包括以下關鍵環節:開發環境搭建使用IntelliJ IDEA Ultimate版&#…

【計算機網絡 | 第3篇】物理媒介

文章目錄物理媒介介紹與物理媒體的分類🥝成本考量引導型傳輸媒體🍋引導型傳輸媒體:雙絞線🍋?🟩雙絞線類別雙絞線的發展歷程雙絞線的物理限制引導型傳輸媒體:同軸電纜🍋?🟩結構組成…

golang的切片

切片 為什么需要切片 用于元素的個數不確定,所以無法通過數組的形式來進行統計。此時就需要切片 切片,也因此可以粗略地理解為動態數組數組的長度不能用變量來確定,這時候切片slice也就派上用場了 切片地基本介紹 切片的英文是slice切片是數組…

在labview中實現視頻播放

這里分享一個迅雷的視頻播放控件APlayer,非常的好用。具體操作步驟如下: 1.下載控件: 首先下載http://aplayer.open.xunlei.com/codecs.zip,將codecs文件解壓后打開,按快捷鍵contrlA,隨后contrlc復制里面所有的文件;…

ubuntu 22.04 使用yaml文件 修改靜態ip

前提: 啟動服務 sudo systemctl start systemd-networkd 設置開機自啟 sudo systemctl enable systemd-networkd 檢查狀態(確保顯示 active (running)) sudo systemctl status systemd-networkd 若想停止: 停止當前運行的服務 sud…

閘機控制系統從設計到實現全解析:第 4 篇:Redis 緩存與分布式鎖實現

第 4 篇:Redis 緩存與分布式鎖實現 一、Redis 在系統中的核心作用票證信息緩存:將高頻訪問的票證數據(如狀態、有效期)緩存至 Redis,減少數據庫查詢,提升驗證響應速度。分布式鎖:在高并發場景下…

北京天津唐山廊坊滄州打撈日記

北京天津唐山廊坊滄州打撈日記 打撈搜蚯蚓疏通 北京:護城河畔的情誼打撈 清晨,北京的護城河在朝陽的映照下泛著微光。我接到一位年輕小伙的電話,聲音中滿是焦急。原來,他與女友在河邊約會時,不小心將女友送他的定情玉佩…

全志刷機工具:PhoenixSuit-全志芯片處理器-刷機工具安裝包及最詳細使用教程指南

全志刷機工具:PhoenixSuit-全志芯片處理器刷機工具安裝包及最詳細使用教程指南,此文章主要是分享機頂盒、電視盒子,全志芯片盒子(其中包含全志處理器、全志芯片、全志CPU等等)的刷機工具、刷機工具安裝教程以及如何使用…

淺談 VM 橋接模式:讓虛擬機像真實電腦一樣接入網絡

在虛擬化環境中,虛擬機(Virtual Machine, VM)與外部網絡之間的通信方式有多種,比如 NAT 模式、Host-Only 模式、橋接模式(Bridged Networking) 等。其中,橋接模式是最接近“真實物理機”網絡行為…

計算機視覺(1)-圖像采集設備選型全景表(工業 + 醫療 + 車載)

圖像采集設備選型全景表(工業 醫療 車載)一份面向工程師的“場景—設備—協議”速查表1 工業 & 醫療 & 通用場景應用場景主流設備形態接口 / 協議典型性能突出優勢致命短板動態范圍工業檢測AOI / 量測 / 缺陷工業相機 采集卡Camera Link HSCo…

計算機視覺(3)深度學習模型部署平臺技術選型與全棧實踐指南

一、部署平臺概述與分類 深度學習模型部署平臺的分類需兼顧技術特性與應用場景的適配性,基于“技術定位-場景適配”雙維度分類法,可將其劃分為通用開源框架、云廠商服務及專用邊緣工具三大類,各類別在設計目標、核心能力與場景覆蓋上呈現顯著…