【C++設計模式之Template Method Pattern】

C++設計模式之Template Method Pattern

  • 模式定義
  • 核心思想
  • 動機(Motivation)
  • 結構(Structure)
  • 實現步驟
  • 應用場景
  • 要點總結


模式定義

模式定義: 定義一個操作中的算法的骨架(穩定),而將一些步驟延遲(變化)到子類中。Template Method使得子類可以不改變(復用)一個算法的結構即可重定義(override重寫)該算法的某些特定步驟。
它定義了一個算法的骨架,將某些步驟的具體實現延遲到子類中。該模式通過固定算法結構,允許子類在不改變算法流程的前提下重新定義某些步驟。

核心思想

  • 不變流程,可變細節:將算法的公共邏輯封裝在基類中,具體步驟的實現交給子類。
  • 避免重復代碼:通過復用基類的模板方法,減少子類中的冗余邏輯。
  • 控制擴展點:明確哪些步驟允許子類重寫,哪些必須固定。

動機(Motivation)

  • 在軟件構建過程中,對于某一項任務,它常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由于固有的原因(比如框架與應用之間的關系)而無法和任務的整體結構同時實現。
  • 如何在確定穩定操作結構的前提下,來靈活應對各個子步驟的變化或者晚期實現需求?

結構(Structure)

在這里插入圖片描述

實現步驟

  1. 定義抽象基類

基類中聲明模板方法(通常為非虛函數),并定義算法的步驟接口(可以是純虛函數或虛函數)

abstractclass.h

#include<iostream>//定義抽象基類
class AbstractClass {
public:virtual ~AbstractClass() = default;//模板方法:定義算法骨架(不可被子類重寫)void templateMethod() {step1();step2();step3();}
protected://具體步驟(子類必須實現的接口)virtual void step1() = 0;  //純虛函數virtual void step2() = 0;virtual void step3() {std::cout << "AbstractClass::step3(默認實現)\n";}
};
  1. 實現具體子類

子類重寫基類中的步驟方法,提供具體實現

concreteclass.h

#include"abstractclass.h"
class ConcreteClassA :public AbstractClass {
protected:void step1()override {std::cout << "ConcreteClassA:step1 \n";}void step2()override {std::cout << "ConcreteClassA:step2 \n";}//step3使用基類默認實現
};class ConcreteClassB :public AbstractClass {
protected:void step1() override {std::cout << "ConcreteClassB::step1\n";}void step2() override {std::cout << "ConcreteClassB::step2\n";}void step3() override {std::cout << "ConcreteClassB::step3\n";}
};
  1. 示例調用
    main.cpp
#include"concreteclass.h"int main()
{ConcreteClassA objA;objA.templateMethod();   //調用固定流程:step1->step2->step3(默認)ConcreteClassB objB;objB.templateMethod();   //調用流程:step1->step2->step3(自定義)
}
  1. 輸出結果
ConcreteClassA:step1
ConcreteClassA:step2
AbstractClass::step3(默認實現)
ConcreteClassB::step1
ConcreteClassB::step2
ConcreteClassB::step3

應用場景

  1. 框架設計:定義框架的流程(如初始化、運行、清理),允許用戶自定義具體步驟,即定義抽象基類

gameframework.h

#pragma once
#include<iostream>
class GameFramework {
public:void run() { //模板方法initialize();mainLoop();shutdown();}protected:virtual void initialize() = 0;  //子類實現初始化邏輯virtual void mainLoop() = 0;    //子類實現主循環邏輯virtual void shutdown() {       //默認實現std::cout << "GameFramework::shutdown \n";}
};
  1. 數據處理流程:固定數據讀取、處理、保存,允許自定義處理邏輯,即定義抽象基類*
#pragma once
#include<iostream>
class DataProcessor {
public:void process() {//模板方法loadData();analyzeData();saveResult();}protected:virtual void loadData() = 0;virtual void analyzeData() = 0;virtual void saveResult() {std::cout << "Data saved to default path. \n";}
};

要點總結

  • Template Method模式是一種非常基礎性的設計模式,在面向對象系統中有著大量的應用。它用最簡潔的機制(虛函數的多態性)為很多應用程序框架提供了靈活的擴展點,是代碼復用方面的基本實現結構。
  • 除了可以靈活應對子步驟的變化外,“不要調用我,讓我來調用你”的反向控制結構是Template Method的典型應用。
  • 在具體實現方面,被Template Method調用的虛方法可以具有實現,也可以沒有任何實現(抽象方法、純虛方法),但一般推薦將它們設置為protected方法。

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

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

相關文章

【動態導通電阻】p-GaN HEMTs正向和反向導通下的動態導通電阻

2024 年,浙江大學的 Zonglun Xie 等人基于多組雙脈沖測試方法,研究了兩種不同技術的商用 p-GaN 柵極 HEMTs 在正向和反向導通模式以及硬開關和軟開關條件下的動態導通電阻(RON)特性。實驗結果表明,對于肖特基型 p-GaN 柵極 HEMTs,反向導通時動態 RON 比正向導通高 3%-5%;…

PDFMathTranslate:科學 PDF 文件翻譯及雙語對照工具

PDFMathTranslate&#xff1a;科學 PDF 文件翻譯及雙語對照工具 在科研和學習過程中&#xff0c;我們經常會遇到大量的英文 PDF 文獻&#xff0c;翻譯這些文獻成為了一項繁瑣且耗時的工作。PDFMathTranslate 是一款強大的科學 PDF 文件翻譯及雙語對照工具&#xff0c;它能夠保…

Flutter PIP 插件 ---- 為iOS 重構PipController, Demo界面,更好的體驗

接上文 Flutter PIP 插件 ---- 新增PipActivity&#xff0c;Android 11以下支持自動進入PIP Mode 項目地址 PIP&#xff0c; pub.dev也已經同步發布 pip 0.0.3&#xff0c;你的加星和點贊&#xff0c;將是我繼續改進最大的動力 在之前的界面設計中&#xff0c;還原動畫等體驗一…

【Ansible】之inventory主機清單

前言 本篇博客主要解釋Ansible主機清單的相關配置知識 一、inventory 主機清單 Inventory支持對主機進行分組&#xff0c;每個組內可以定義多個主機&#xff0c;每個主機都可以定義在任何一個或多個主機組內。 如果是名稱類似的主機&#xff0c;可以使用列表的方式表示各個主機…

基于幾何布朗運動的股價預測模型構建與分析

基于幾何布朗運動的股價預測模型構建與分析 摘要 本文建立基于幾何布朗運動的股價預測模型&#xff0c;結合極大似然估計與蒙特卡洛模擬&#xff0c;推導股價條件概率密度函數并構建動態預測區間。實證分析顯示模型在標普500指數預測中取得89%的覆蓋概率&#xff0c;波動率估…

【前端】【JavaScript】【總復習】四萬字詳解JavaScript知識體系

JavaScript 前端知識體系 &#x1f4cc; 說明&#xff1a;本大綱從基礎到高級、從語法到應用、從面試到實戰&#xff0c;分層級講解 JavaScript 的核心內容。 一、JavaScript 基礎語法 1.1 基本概念 1.1.1 JavaScript 的發展史與用途 1. 發展簡史 1995 年&#xff1a;JavaS…

[Java實戰]Spring Boot 3 整合 Apache Shiro(二十一)

[Java實戰]Spring Boot 3 整合 Apache Shiro&#xff08;二十一&#xff09; 引言 在復雜的業務系統中&#xff0c;安全控制&#xff08;認證、授權、加密&#xff09;是核心需求。相比于 Spring Security 的重量級設計&#xff0c;Apache Shiro 憑借其簡潔的 API 和靈活的擴…

PyTorch API 6 - 編譯、fft、fx、函數轉換、調試、符號追蹤

文章目錄 torch.compiler延伸閱讀 torch.fft快速傅里葉變換輔助函數 torch.func什么是可組合的函數變換&#xff1f;為什么需要可組合的函數變換&#xff1f;延伸閱讀 torch.futurestorch.fx概述編寫轉換函數圖結構快速入門圖操作直接操作計算圖使用 replace_pattern() 進行子圖…

可觀測性方案怎么選?SelectDB vs Elasticsearch vs ClickHouse

可觀測性&#xff08;Observability&#xff09;是指通過系統的外部輸出數據&#xff0c;推斷其內部狀態的能力。可觀測性平臺通過采集、存儲、可視化分析三大可觀測性數據&#xff1a;日志&#xff08;Logging&#xff09;、鏈路追蹤&#xff08;Tracing&#xff09;和指標&am…

機器人廚師上崗!AI在餐飲界掀起新風潮!

想要了解人工智能在其他各個領域的應用&#xff0c;可以查看下面一篇文章 《AI在各領域的應用》 餐飲業是與我們日常生活息息相關的行業&#xff0c;而人工智能&#xff08;AI&#xff09;正在迅速改變這個傳統行業的面貌。從智能點餐到食材管理&#xff0c;再到個性化推薦&a…

Linux動態庫靜態庫總結

靜態庫生成 g -c mylib.cpp -o mylib.o ar rcs libmylib.a mylib.o 動態庫生成 g -fPIC -shared mylib.cpp -o libmylib.so -fPIC&#xff1a;生成位置無關代碼&#xff08;Position-Independent Code&#xff09;&#xff0c;對動態庫必需。 庫文件使用&#xff1a; 靜態庫&…

通過user-agent來源判斷阻止爬蟲訪問網站,并防止生成[ error ] NULL日志

一、TP5.0通過行為&#xff08;Behavior&#xff09;攔截爬蟲并避免生成 [ error ] NULL 錯誤日志 1. 創建行為類&#xff08;攔截爬蟲&#xff09; 在 application/common/behavior 目錄下新建BlockBot.php &#xff0c;用于識別并攔截爬蟲請求&#xff1a; <?php name…

OpenHarmony平臺驅動開發(十五),SDIO

OpenHarmony平臺驅動開發&#xff08;十五&#xff09; SDIO 概述 功能簡介 SDIO&#xff08;Secure Digital Input and Output&#xff09;由SD卡發展而來&#xff0c;與SD卡統稱為MMC&#xff08;MultiMediaCard&#xff09;&#xff0c;二者使用相同的通信協議。SDIO接口…

使用FastAPI和React以及MongoDB構建全棧Web應用03 全棧開發快速入門

一、什么是全棧開發 A full-stack web application is a complete software application that encompasses both the frontend and backend components. It’s designed to interact with users through a web browser and perform actions that involve data processing and …

Coco AI 開源應用程序 - 搜索、連接、協作、您的個人 AI 搜索和助手,都在一個空間中。

一、軟件介紹 文末提供程序和源碼下載 Coco AI 是一個統一的搜索平臺&#xff0c;可將您的所有企業應用程序和數據&#xff08;Google Workspace、Dropbox、Confluent Wiki、GitHub 等&#xff09;連接到一個功能強大的搜索界面中。此存儲庫包含為桌面和移動設備構建的 Coco 應…

CSS經典布局之圣杯布局和雙飛翼布局

目標&#xff1a; 中間自適應&#xff0c;兩邊定寬&#xff0c;并且三欄布局在一行展示。 圣杯布局 實現方法&#xff1a; 通過float搭建布局margin使三列布局到一行上relative相對定位調整位置&#xff1b; 給外部容器添加padding&#xff0c;通過相對定位調整左右兩列的…

# 實時英文 OCR 文字識別:從攝像頭到 PyQt5 界面的實現

實時英文 OCR 文字識別&#xff1a;從攝像頭到 PyQt5 界面的實現 引言 在數字化時代&#xff0c;文字識別技術&#xff08;OCR&#xff09;在眾多領域中發揮著重要作用。無論是文檔掃描、車牌識別還是實時視頻流中的文字提取&#xff0c;OCR 技術都能提供高效且準確的解決方案…

<C#>log4net 的配置文件配置項詳細介紹

log4net 是一個功能強大的日志記錄工具&#xff0c;通過配置文件可以靈活地控制日志的輸出方式、格式、級別等。以下是對 log4net 配置文件常見配置項的詳細介紹&#xff1a; 根元素 <log4net> 這是 log4net 配置文件的根元素&#xff0c;所有配置項都要包含在該元素內…

編譯docker版openresty

使用alpine為基礎鏡像 # 使用Alpine作為基礎鏡像 FROM alpine:3.18# 替換為阿里云鏡像源&#xff0c;并安裝必要的依賴 RUN sed -i s|https://dl-cdn.alpinelinux.org/alpine|https://mirrors.aliyun.com/alpine|g /etc/apk/repositories && \apk add --no-cache \bui…

conda 輸出指定python環境的庫 輸出為 yaml文件

conda 輸出指定python環境的庫 輸出為 yaml文件。 有時為了項目部署&#xff0c;需要匹配之前的python環境&#xff0c;需要輸出對應的python依賴庫。 假設你的目標環境名為 myenv&#xff0c;運行以下命令&#xff1a; conda env export -n myenv > myenv_environment.ym…