趣談設計模式之模板方法模式-老板,你的數字咖啡制作好了,請享用!

模板方法模式

定義了一套算法的骨架,講某些具體的步驟延遲到子類中實現。 主要用于不改變算法結構的情況下重新定義算法的某些步驟,以適應新的需求。

模板方法的角色
  • 抽象類: 作為算法的骨架,該抽象類中包含了算法的核心部分和一些抽象方法,也可能包含一些具體方法,其中抽象方法表示算法中需要子類實現的具體步驟
  • 具體子類:繼承抽象類,實現抽象方法以完成算法的具體步驟。 子類也可以實現一些 鉤子方法 以影響算法的執行。
模板方法的優缺點

優點:

  • 提高代碼的復用性
  • 提高代碼的可擴展性
  • 符合開閉原則

缺點:

  • 抽象類和具體子類之間耦合度較高(組合優于繼承),抽象類發生變化時,可能會影響到所有子類,比如父類增加新的抽象方法,那么所有的子類需要都實現一遍。
應用場景
  • 自上而下的父類視角:在抽象類中實現一個算法的公共部分,將可變的部分 留給具體子類實現
  • 自下而上的子類視角:將子類中的公共部分提取出來,集中到父類中,避免代碼重復

示例場景: 文檔處理器
假設我們有一個文檔處理器,它需要執行以下步驟:

打開文檔
解析文檔內容
處理文檔內容
保存處理后的文檔

from abc import ABC, abstractmethod# 抽象類:文檔處理器
class DocumentProcessor(ABC):def process_document(self):"""模板方法,定義處理文檔的步驟"""self.open_document()content = self.parse_document()processed_content = self.handle_content(content)self.save_document(processed_content)@abstractmethoddef open_document(self):"""抽象方法:打開文檔"""pass@abstractmethoddef parse_document(self):"""抽象方法:解析文檔內容"""passdef handle_content(self, content):"""默認實現:處理文檔內容"""# 默認處理邏輯,子類可以重寫return content.upper()@abstractmethoddef save_document(self, processed_content):"""抽象方法:保存處理后的文檔"""pass# 具體類:PDF文檔處理器
class PDFProcessor(DocumentProcessor):def open_document(self):print("打開PDF文檔")def parse_document(self):print("解析PDF內容")return "PDF內容"def save_document(self, processed_content):print(f"保存處理后的PDF內容:{processed_content}")# 具體類:Word文檔處理器
class WordProcessor(DocumentProcessor):def open_document(self):print("打開Word文檔")def parse_document(self):print("解析Word內容")return "Word內容"def save_document(self, processed_content):print(f"保存處理后的Word內容:{processed_content}")def handle_content(self, content):# 重寫處理內容的方法return content.lower()# 測試代碼
def main():# 創建PDF處理器實例pdf_processor = PDFProcessor()pdf_processor.process_document()print("\n")# 創建Word處理器實例word_processor = WordProcessor()word_processor.process_document()if __name__ == "__main__":main()
虛構故事

接-上一節講的狀態模式之比特咖啡故事。比特咖啡的故事-傳送門, 老板姬比特要給比特咖啡研發兩款數字咖啡產品并通過這兩款引流想打造成爆款(美式和卡布奇諾), 程序員-幸瑞接過了這個活,他使用-模板方法模式設計了數字咖啡的制作流程。
且看他的代碼是如何實現的。

from abc import ABC, abstractmethodclass CoffeeMaker(ABC):def make_coffee(self):"""模板方法,定義制作咖啡的整體流程"""self.grind_coffee()self.brew_coffee()self.add_ingredients()self.finish_coffee()@abstractmethoddef grind_coffee(self):"""抽象方法:研磨咖啡豆"""pass@abstractmethoddef brew_coffee(self):"""抽象方法:沖泡咖啡"""passdef add_ingredients(self):"""默認方法:添加配料"""# 默認不添加任何配料,子類可以重寫pass@abstractmethoddef finish_coffee(self):"""抽象方法:完成咖啡制作"""pass

代碼寫到這,骨架算是搭建起來了,幸瑞準備去外面抽根煙休息一會,剛要鎖屏起身時,老板-姬比特走了過來看到屏幕一堆pass,一萬個問號, 老幸,你搞這么多pass干什么, pass在python中是占位符表示什么也不做,我還是懂一點的,你小子是不是急著開溜摸魚啊。
幸瑞連忙給老板解釋說,我這是把數字咖啡的制作流程先抽象了出來,具體的實現方式還沒寫呢,辦公室這會有點悶,我先出去透透氣,順便梳理下思路。 隨后,幸瑞按下了win+L瀟灑的離去。 只剩下老板愣在原地表情瞬間凝固。

20min later…
幸瑞緩緩的走進辦公室開始干活,見他飛快的敲擊著新買的Filco機械鍵盤,聲音響徹狹小的辦公室。 不一會兒又安靜了下來。 原來功能已經實現了,接下來我們看看他是如何實現的。
首先,他創建兩個具體的子類 AmericanoMaker 和 CappuccinoMaker,分別對應美式咖啡和卡布奇諾的制作步驟。

class AmericanoMaker(CoffeeMaker):def grind_coffee(self):print("研磨中度烘焙的咖啡豆")def brew_coffee(self):print("用熱水沖泡咖啡,制作美式咖啡")def add_ingredients(self):print("加入適量的熱水")def finish_coffee(self):print("美式咖啡制作完成,可以享用了!")class CappuccinoMaker(CoffeeMaker):def grind_coffee(self):print("研磨深度烘焙的咖啡豆")def brew_coffee(self):print("用蒸汽牛奶沖泡咖啡,制作卡布奇諾")def add_ingredients(self):print("打發牛奶并加入奶泡")def finish_coffee(self):print("卡布奇諾制作完成,可以享用了!")# 接著,為了驗證設計是否正確,編寫了測試代碼,分別創建美式咖啡和卡布奇諾的制作實例,并調用 make_coffee 方法
def main():# 創建美式咖啡制作實例americano_maker = AmericanoMaker()print("制作美式咖啡:")americano_maker.make_coffee()print("\n")# 創建卡布奇諾制作實例cappuccino_maker = CappuccinoMaker()print("制作卡布奇諾:")cappuccino_maker.make_coffee()if __name__ == "__main__":main()# 運行結果如下
制作美式咖啡:
研磨中度烘焙的咖啡豆
用熱水沖泡咖啡,制作美式咖啡
加入適量的熱水
美式咖啡制作完成,可以享用了!制作卡布奇諾:
研磨深度烘焙的咖啡豆
用蒸汽牛奶沖泡咖啡,制作卡布奇諾
打發牛奶并加入奶泡
卡布奇諾制作完成,可以享用了!

老板,你的數字咖啡制作好了,請享用! 幸瑞大聲的說道,辦公室的N多雙眼睛瞬間將焦點轉移到了幸瑞的工位上…

欲知后事如何,點贊關注不迷路,比特咖啡的故事還會繼續講下去.

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

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

相關文章

技術棧:基于Java語言的搭子_搭子社交_圈子_圈子社交_搭子小程序_搭子APP平臺

一、市場背景1、社會發展與生活方式轉變城市化進程加快:隨著城市化不斷推進,大量人口涌入城市,人們生活的物理空間距離拉近了,但人際關系卻在一定程度上變得疏離。傳統的基于血緣、地緣建立起的緊密社交關系難以滿足城市生活中的多…

字典在VBA與VB.NET的區別,舉例說明

簡述:在VBA中,字典通常使用Scripting.Dictionary對象,通過CreateObject("Scripting.Dictionary")創建。它需要引用Microsoft Scripting Runtime庫(scrrun.dll)。VBA字典的方法包括Exists、Add、Remove等&…

2024年網絡安全案例

以下是2024年造成嚴重損失的網絡安全典型案例,涵蓋市政系統、金融交易、區塊鏈平臺、國家級攻擊及全球性IT故障五大領域,按損失規模和技術危害性綜合排序:---一、市政基礎設施攻擊 1. 加拿大漢密爾頓市勒索軟件事件 - 損失:183…

PINN+貝葉斯:深度學習中的魔改新思路

2025深度學習發論文&模型漲點之——PINN貝葉斯PINN通過將物理定律(如偏微分方程PDEs)嵌入神經網絡的損失函數中,使得模型能夠利用已知的物理規律來指導學習過程,從而在數據有限或噪聲較多的情況下實現更高的準確性。然而&…

零基礎-動手學深度學習-8.3. 語言模型和數據集

很至關重要的一章: 8.3.1. 學習語言模型 8.3.2. 馬爾可夫模型與n元語法 n元語法看的序列長度是固定的, 存儲的序列長是有限且可控的,使用統計方法的時候通常使用這個模型!!!統計方法!!&#x…

C++ 模板初階

什么是模板? 模板(Template)是 C 中實現泛型編程的核心工具。它允許我們編寫與具體數據類型無關的代碼,從而實現代碼復用和類型安全。為什么需要模板? 舉個生活中的例子:如果你要造一個能裝水的杯子&#x…

DockerFile文件執行docker bulid自動構建鏡像

文章目錄一、Dockerfile介紹二、Dockerfile鏡像制作和流程使用三、Dockerfile文件的制作鏡像的分層結構四、Dockerfile文件格式五、Dockerfile相關指令5.1 FROML:指定基礎鏡像5.2 LABEL:指定鏡像元數據5.3 RUN:執行shell指令5.4 ENV&#xff…

osloader!DoGlobalInitialization函數分析之HW_CURSOR--NTLDR源代碼分析之設置光標

第一部分: VOID DoGlobalInitialization(IN PBOOT_CONTEXT BootContextRecord){//// Turn the cursor off//HW_CURSOR(0,127);D:\srv03rtm\base\boot/inc/bldrx86.h:258:#define HW_CURSOR (*ExternalServicesTable->HardwareCursor)第二部分&#xff…

Elasticsearch 索引及節點級別增刪改查技術

以下是針對 Elasticsearch 索引及節點級別增刪改查技術做的簡短總結&#xff1a; 一、索引操作創建索引 功能&#xff1a;指定分片、副本數及映射規則[2][4]。示例&#xff1a;PUT /<index_name>?&#xff0c;可定義 settings&#xff08;如分片數&#xff09;和 mappin…

烽火HG680-KD_海思MV320處理器-安卓9-原廠系統升級包-針對解決燒錄不進系統的問題

烽火HG680-KD_海思MV320處理器-安卓9-原廠系統升級包&#xff08;注意是&#xff08;原機系統&#xff09;&#xff09;-主要是針對解決TTL燒錄后仍然不進系統使用。HG680-KD&#xff0f;HG680-KE&#xff0f;HG680-KF&#xff0f;HG680-KX 均通用。 說明&#xff1a; 前一個…

VS2019安裝HoloLens 沒有設備選項

第一步先檢查VS有沒有安裝C組件第二步把VS工程最后一個設置為啟動項

【云計算】云主機的親和性策略(二):集群節點組

《云主機的親和性策略》系列&#xff0c;共包含以下文章&#xff1a; 1?? 云主機的親和性策略&#xff08;一&#xff09;&#xff1a;快樂旅行團2?? 云主機的親和性策略&#xff08;二&#xff09;&#xff1a;集群節點組3?? 云主機的親和性策略&#xff08;三&#xf…

【人工智能】AI代理在零售業的崛起:從草莓訂購到全流程購物體驗

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 在零售業快速演變的格局中,AI代理正作為變革力量崛起,連接消費者需求與無縫履行。本文深入探討AI代理在零售中的興起,從通過對話界面訂購…

【讀論文】從Qwen3技術報告到Qwen3-30B-A3B 模型的深度解讀

引言:當大模型追求又小又好用 最近都是各種新大模型滿天飛,其中Qwen3-30B-A3B-Instruct-2507很是亮眼,這種參數尺寸是相對友好的,效果好而且模型不大。從這里就引發一下疑問,如何在保證強大能力的同時,兼顧模型的效率和可訪問性?毫無疑問,混合專家 (Mixture-of-Expert…

【番外篇15】中心極限定理:從數學原理到生活案例

一、什么是中心極限定理&#xff1f;中心極限定理(Central Limit Theorem, CLT)是概率論與統計學中最重要的定理之一&#xff0c;它揭示了為什么正態分布在自然界和統計學中如此普遍。?定理表述?&#xff1a;設X?, X?, ..., X? 是一組獨立同分布的隨機變量序列&#xff0c…

本地構建Docker鏡像并推送到GitHub Container Registry

一、本地構建并推送鏡像1. 登錄GitHub Container Registry首先&#xff0c;需要登錄到GitHub Container Registry (GHCR)&#xff1a;# 使用個人訪問令牌(PAT)登錄 docker login ghcr.io -u 你的GitHub用戶名 -p 你的個人訪問令牌注意&#xff1a;你需要在GitHub上創建一個具有…

DP-v2.1-mem-clean學習(3.6.8-3.6.8.1)

3.6.8 lttpr非透明模式下的鏈路訓練 3.6.8.1 支持8b/10b鏈路層訓練規范 ?默認透明模式? 若上游設備未啟用LTTPR非透明模式(Non-transparent),需在鏈路訓練前將DPCD F0003h寄存器寫入默認值55h38 ?非法中繼器計數值處理? 當DPCD F0002h(PHY_REPEATER_CNT)返回值非有…

kali安裝maven

kali安裝maven 下載maven的安裝包 wget https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gz 注意可能返回404&#xff0c;這是因為官網已經更新了版本&#xff0c;這種情況可以自己訪問https://dlcdn.apache.org/maven/maven-3查看一下最…

GEO優化:品牌營銷新戰場的光明與荊棘

在AI重塑信息獲取方式的今天&#xff0c;一種名為GEO&#xff08;生成式引擎優化&#xff09;?的策略正悄然成為企業營銷版圖的新坐標。它不追求傳統搜索引擎中的鏈接排名&#xff0c;而是爭奪生成式AI&#xff08;如ChatGPT、DeepSeek等&#xff09;答案中的“話語權”——讓…

牛客 - 旋轉數組的最小數字

描述 有一個長度為 n 的非降序數組&#xff0c;比如[1,2,3,4,5]&#xff0c;將它進行旋轉&#xff0c;即把一個數組最開始的若干個元素搬到數組的末尾&#xff0c;變成一個旋轉數組&#xff0c;比如變成了[3,4,5,1,2]&#xff0c;或者[4,5,1,2,3]這樣的。請問&#xff0c;給定這…