Python 設計模式:模板模式

1. 什么是模板模式?

模板模式是一種行為設計模式,它定義了一個操作的算法的骨架,而將一些步驟延遲到子類中。模板模式允許子類在不改變算法結構的情況下,重新定義算法的某些特定步驟。

模板模式的核心思想是將算法的固定部分提取到一個基類中,而將可變部分留給子類實現。這樣可以避免代碼重復,提高代碼的復用性和可維護性。

模板模式通常包含以下幾個組成部分:

  • 抽象類(Abstract Class):定義模板方法和一些抽象方法。模板方法是算法的骨架,調用其他方法來完成具體的步驟。
  • 具體類(Concrete Class):實現抽象類中的抽象方法,提供具體的實現。

模板模式在軟件設計中具有多種優點:

  • 代碼復用:通過將算法的固定部分提取到基類中,減少了代碼重復,提高了代碼的復用性。
  • 靈活性:子類可以根據需要實現不同的步驟,而不需要修改算法的整體結構。
  • 易于維護:算法的固定部分集中在一個地方,便于管理和維護。
from abc import ABC, abstractmethod# 抽象類
class DataProcessor(ABC):def process_data(self):self.read_data()  # 讀取數據self.clean_data()  # 清洗數據self.analyze_data()  # 分析數據self.save_results()  # 保存結果@abstractmethoddef read_data(self):pass@abstractmethoddef clean_data(self):pass@abstractmethoddef analyze_data(self):pass@abstractmethoddef save_results(self):pass# 具體類:處理 CSV 數據
class CSVDataProcessor(DataProcessor):def read_data(self):print("Reading data from CSV file.")def clean_data(self):print("Cleaning CSV data.")def analyze_data(self):print("Analyzing CSV data.")def save_results(self):print("Saving results to CSV file.")# 具體類:處理 JSON 數據
class JSONDataProcessor(DataProcessor):def read_data(self):print("Reading data from JSON file.")def clean_data(self):print("Cleaning JSON data.")def analyze_data(self):print("Analyzing JSON data.")def save_results(self):print("Saving results to JSON file.")# 客戶端代碼
if __name__ == "__main__":csv_processor = CSVDataProcessor()csv_processor.process_data()  # 處理 CSV 數據print("\n")json_processor = JSONDataProcessor()json_processor.process_data()  # 處理 JSON 數據
  1. 抽象類DataProcessor 類定義了模板方法 process_data,該方法調用了其他方法來完成數據處理的各個步驟。它還定義了一些抽象方法(read_dataclean_dataanalyze_datasave_results),這些方法將在子類中實現。

  2. 具體類

    • CSVDataProcessor 類實現了 DataProcessor 抽象類,提供了處理 CSV 數據的具體實現。
    • JSONDataProcessor 類同樣實現了 DataProcessor 抽象類,提供了處理 JSON 數據的具體實現。
  3. 客戶端代碼

    • 在客戶端代碼中,創建 CSVDataProcessorJSONDataProcessor 的實例,并調用 process_data 方法來處理數據。
    • 每個具體類都實現了自己的數據處理邏輯,但它們都遵循了相同的處理流程。

2. 模板模式和繼承機制的區別

2.1 模板模式的目的

模板模式的主要目的是定義一個算法的骨架,并將某些步驟的實現延遲到子類中。它強調的是算法的結構和步驟的固定性,同時允許子類在不改變算法整體結構的情況下,提供具體的實現。這種模式的使用場景通常是在多個類中有相似的操作流程,但具體的實現細節可能不同。

2.2 普通繼承的特點

普通的繼承機制允許子類繼承父類的屬性和方法。雖然子類可以重寫父類的方法,但這種重寫并不一定遵循特定的算法結構。普通繼承更關注的是屬性和行為的復用,而不一定是算法的步驟和流程。

2.3 模板模式的結構

在模板模式中,通常會有一個抽象類(模板類),它定義了一個模板方法,包含了算法的固定步驟。具體的實現則在子類中完成。模板方法通常是一個公開的方法,子類通過實現抽象方法來提供具體的行為。

class Template:def template_method(self):self.step_one()self.step_two()self.step_three()def step_one(self):pass  # 默認實現或抽象方法def step_two(self):pass  # 默認實現或抽象方法def step_three(self):pass  # 默認實現或抽象方法

2.4 與普通繼承的區別

  • 結構化:模板模式強調算法的結構和步驟的順序,而普通繼承可能沒有這樣的結構化要求。
  • 靈活性:模板模式允許子類在不改變算法結構的情況下,靈活地實現具體步驟,而普通繼承可能會導致子類的實現與父類的實現緊密耦合。
  • 可維護性:模板模式通過將算法的固定部分集中在一個地方,便于管理和維護,而普通繼承可能會導致代碼分散,增加維護難度。

2.5 實際應用中的理解

在實際開發中,我們可能會無意中使用普通繼承來實現某些功能,但這并不意味著我們在使用模板模式。模板模式的使用是有意識的設計選擇,旨在解決特定的問題,如算法的復用和擴展。

例如,在一個數據處理應用中,如果我們有多個數據源(如 CSV、JSON、XML),我們可以使用模板模式來定義數據處理的通用步驟,而具體的讀取、清洗和分析邏輯則在各自的子類中實現。這種方式使得我們可以輕松地添加新的數據源,而不需要修改現有的代碼結構。

2.6 總結

模板模式不僅僅是面向對象的繼承機制,它是一種設計思想,強調算法的結構和步驟的復用。通過使用模板模式,我們可以提高代碼的可維護性和可擴展性,避免代碼重復,并使得系統在面對變化時更加靈活。理解模板模式的目的和應用場景,可以幫助我們在設計軟件時做出更好的決策。

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

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

相關文章

【后端】構建簡潔的音頻轉寫系統:基于火山引擎ASR實現

在當今數字化時代,語音識別技術已經成為許多應用不可或缺的一部分。無論是會議記錄、語音助手還是內容字幕,將語音轉化為文本的能力對提升用戶體驗和工作效率至關重要。本文將介紹如何構建一個簡潔的音頻轉寫系統,專注于文件上傳、云存儲以及…

音頻base64

音頻 Base64 是一種將二進制音頻數據(如 MP3、WAV 等格式)編碼為 ASCII 字符串的方法。通過 Base64 編碼,音頻文件可以轉換為純文本形式,便于在文本協議(如 JSON、XML、HTML 或電子郵件)中傳輸或存儲&#…

240422 leetcode exercises

240422 leetcode exercises jarringslee 文章目錄 240422 leetcode exercises[237. 刪除鏈表中的節點](https://leetcode.cn/problems/delete-node-in-a-linked-list/)🔁節點覆蓋法 [392. 判斷子序列](https://leetcode.cn/problems/is-subsequence/)🔁…

MYSQL之庫的操作

創建數據庫 語法很簡單, 主要是看看選項(與編碼相關的): CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1. 語句中大寫的是…

Git Flow分支模型

經典分支模型(Git Flow) 由 Vincent Driessen 提出的 Git Flow 模型,是管理 main(或 master)和 dev 分支的經典方案: main 用于生產發布,保持穩定; dev 用于日常開發,合并功能分支(feature/*); 功能開發在 feature 分支進行,完成后合并回 dev; 預發布分支(rele…

【Spring】依賴注入的方式:構造方法、setter注入、字段注入

在Spring框架中,除了構造器注入(Constructor Injection)和Setter注入(Setter Injection),還有一種依賴注入方式:字段注入(Field Injection)。字段注入通過在Bean的字段上…

【數學建模】隨機森林算法詳解:原理、優缺點及應用

隨機森林算法詳解:原理、優缺點及應用 文章目錄 隨機森林算法詳解:原理、優缺點及應用引言隨機森林的基本原理隨機森林算法步驟隨機森林的優點隨機森林的缺點隨機森林的應用場景Python實現示例超參數調優結論參考文獻 引言 隨機森林是機器學習領域中一種…

HttpSessionListener 的用法筆記250417

HttpSessionListener 的用法筆記250417 以下是關于 HttpSessionListener 的用法詳解,涵蓋核心方法、實現步驟、典型應用場景及注意事項,幫助您全面掌握會話(Session)生命周期的監聽與管理: 1. 核心功能 HttpSessionLi…

【Python爬蟲基礎篇】--2.模塊解析

目錄 1.urllib庫 1.1.request模塊 1.1.1、urllib.request.urlopen() 函數 1.1.2.urllib.request.urlretrieve() 函數 1.2. error模塊 1.3. parse 模塊 2. BeautifulSoup4庫 2.1.對象種類 2.2.對象屬性 2.2.1.子節點 2.2.2.父節點 2.2.3.兄弟節點 2.2.4.回退和前進 …

Ubuntu-Linux從桌面到顯示的全流程:技術分析總結

引言 Ubuntu作為主流的Linux發行版,其顯示系統經歷了從傳統X11到現代Wayland的演進。本文將詳細分析從應用程序到屏幕顯示的完整技術流程,包括桌面環境、顯示服務器、圖形棧和硬件交互等核心環節。 1. 系統架構概覽 Ubuntu的顯示系統架構可分為四個主要…

在PyCharm中部署AI模型的完整指南

引言 隨著人工智能技術的快速發展,越來越多的開發者開始將AI模型集成到他們的應用程序中。PyCharm作為一款強大的Python IDE,為AI開發提供了出色的支持。本文將詳細介紹如何在PyCharm中部署AI模型,從環境配置到最終部署的完整流程。 第一部分:準備工作 1. 安裝PyCharm …

WHAT - 靜態資源緩存穿透

文章目錄 1. 動態哈希命名的基本思路2. 具體實現2.1 Vite/Webpack 配置動態哈希2.2 HTML 文件中動態引用手動引用使用 index.html 模板動態插入 2.3 結合 Cache-Control 避免緩存穿透2.4 適用于多環境的動態策略 總結 在多環境部署中,靜態資源緩存穿透是一個常見問題…

PoCL環境搭建

PoCL環境搭建 **一.關鍵功能與優勢****二.設計目的****三.測試步驟**1.創建容器2.安裝依賴3.編譯安裝pocl4.運行OpenCL測試程序 Portable Computing Language (PoCL) 簡介 Portable Computing Language (PoCL) 是一個開源的、符合標準的異構計算框架,旨在為 OpenCL…

【區塊鏈技術解析】從原理到實踐的全鏈路指南

目錄 前言:技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊技術選型對比 二、實戰演示環境配置要求核心代碼實現(10個案例)案例1:創建簡單區塊鏈案例2:工作…

在Windows上安裝Git

一、安裝 Git 下載 Git地址:Git - Downloads (git-scm.com) 1、在頁面中找到適用于 Windows 系統的最新版本安裝包(通常為.exe 格式文件),點擊下載鏈接。 出于訪問Git官網需要科學上網,不會的可以私信我要軟件包&…

Golang interface總結(其一)

本篇是對golang 中的interface做一些淺層的、實用的總結 多態 常用場景 interface內僅包含函數類型,然后定義結構體去實現,如下 package mainimport "fmt"type Animal interface {Sound()Act() }type Cat struct{}func (c *Cat) Sound() {…

TVM計算圖分割--Collage

1 背景 為滿足高效部署的需要,整合大量優化的tensor代數庫和運行時做為后端成為必要之舉。現在的深度學習后端可以分為兩類:1)算子庫(operator kernel libraries),為每個DL算子單獨提供高效地低階kernel實現。這些庫一般也支持算…

Redis——內存策略

目錄 前言 1.過期策略 1.1過期策略——DB結構 1.2過期策略——惰性刪除 1.3過期策略——定期刪除 2.淘汰策略 2.1最少最近使用和使用頻率原理 2.2內存淘汰策略執行流程 總結: 前言 Redis之所以性能強,主要的原因就是基于內存存儲。然而單節點的R…

原型模式詳解及在自動駕駛場景代碼示例(c++代碼實現)

模式定義 原型模式(Prototype Pattern)是一種創建型設計模式,通過克隆已有對象來創建新對象,避免重復執行昂貴的初始化操作。該模式特別適用于需要高效創建相似對象的場景,是自動駕駛感知系統中處理大量重復數據結構的…

在kali中安裝AntSword(蟻劍)

步驟一、下載壓縮包 源碼:https://github.com/AntSwordProject/antSword,下載壓縮包。 加載器:https://github.com/AntSwordProject/AntSword-Loader,根據系統選擇壓縮包(kali選擇AntSword-Loader-v4.0.3-linux-x64&…