模板方法模式Template Method Pattern

模式定義

定義一個操作中算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟

  • 類行為型模式

模式結構

  • AbstractClass:抽象類
  • ConcreteClass:具體子類

只有類之間的繼承關系,沒有對象關聯關系

  • 體現繼承優勢的模式之一

好萊塢原則(Hollywood Principle)

  • Don‘t call us, we’ll call you.
  • 子類不顯式調用父類的方法,而是通過override父類的方法來實現某些具體的業務邏輯,父類控制對子類的調用

通過在子類中實現的鉤子方法override父類鉤子方法,對父類方法的執行進行約束,實現子類對父類行為的反向控制

  • 基本方法(Primitive Method):實現具體邏輯步驟的方法
    • 抽象方法(Abstract Method)
    • 具體方法(Concrete Method)
    • 鉤子方法(Hook Method):“掛鉤”方法和空方法
      ......public void template() {open();display();if(isPrint()) {print();}
      }// Hook Method
      public boolean isPrint() {return true;
      }......
      • 鉤子方法的引入使得子類可以控制父類的行為
      • 最簡單的鉤子方法就是空方法,也可以在鉤子方法中定義一個默認的實現,如果子類不覆蓋鉤子方法,則執行父類的默認實現代碼
      • 比較復雜一點的鉤子方法可以對其他方法進行約束
        • 這種鉤子方法通常返回一個boolean類型,即返回true或false,用來判斷是否執行某一個基本方法
  • 模板方法(Template Method):匯總基本方法的方法

抽象類代碼

public abstract class AbstractClass {// 模板方法public void templateMethod() {primitiveOperation1();primitiveOperation2();primitiveOperation3();}// 基本方法—具體方法public void primitiveOperation1() {// do something}// 基本方法—抽象方法public abstract void primitiveOperation2();// 基本方法—鉤子方法public void primitiveOperation3() {// do something}}

具體子類代碼

public class ConcreteClass extends AbstractClass {public void primitiveOperation2() {// do something}public void primitiveOperation3() {// do something}}

實例

實例一:銀行業務辦理流程
在銀行辦理業務時,一般都包含幾個基本步驟,首先需要取號排隊,然后辦理具體業務,最后需要對銀行工作人員進行評分。無論具體業務是取款、存款還是轉賬,其基本流程都一樣。用模板方法模式模擬銀行業務辦理流程。

實例二:數據庫操作模板
對數據庫的操作一般包括連接、打開、使用、關閉等步驟,在數據庫操作模板類中我們定義了connDB()、openDB()、useDB()、closeDB()四個方法分別對應這四個步驟。對于不同類型的數據庫(如SQL Server和Oracle),其操作步驟都一致,只是連接數據庫connDB()方法有所區別,使用模板方法模式對其進行設計。

模式分析

  • 優點
    • 模板方法模式在一個類中抽象地定義算法,而由它的子類實現
      細節的處理
    • 模板方法模式是一種代碼復用的基本技術
    • 模板方法模式導致一種反向的控制結構(Hook Method),通過一個父類調用其
      子類的操作,通過對子類的擴展增加新的行為
      • 符合開閉原則
  • 缺點
    • 每個不同的實現都需要定義一個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象
      • 但是更加符合“單一職責原則”,使得類的內聚性得以提高

適用環境

  • 一次性實現一個算法的不變的部分,并將可變的行為留給子類來實現
  • 各子類中公共的行為被提取出來并集中到一個公共父類中以避免代碼重復
  • 對一些復雜的算法進行分割,將其算法中固定不變的部分設計為模板方法和父類具體方法,而一些可以改變的細節由其子類來實現
  • 控制子類的擴展

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

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

相關文章

【行云流水AI筆記】游戲里面的強化學習使用場景

強化學習在游戲中的應用已從早期的棋類博弈擴展到現代復雜游戲的全流程優化,以下是結合最新技術進展的核心應用場景及典型案例: 一、競技游戲的策略突破 1. 策略博弈類游戲 代表案例:AlphaGo/AlphaZero(圍棋)、Alph…

使用Python和PyTorch框架,基于RetinaNet模型進行目標檢測,包含數據準備、模型訓練、評估指標計算和可視化

下面是一個完整的實現方案,使用Python和PyTorch框架,基于RetinaNet模型進行目標檢測,包含數據準備、模型訓練、評估指標計算和可視化。 import os import numpy as np import matplotlib.pyplot as plt import torch import torchvision from torchvision.models.detection…

springboot服務如何獲取pod當前ip方案及示例

在 Kubernetes 集群中,Spring Boot 服務獲取 Pod 當前 IP 的方案主要有兩種:通過環境變量注入 或 通過 Java 代碼動態獲取網絡接口 IP。以下是兩種方案的詳細說明及示例: 方案一:通過 Kubernetes Downward API 注入環境變量 原理…

1.MySQL三層結構

1.所謂安裝的Mysql數據庫,就是在電腦上安裝了一個數據庫管理系統(【DBMS】database manage system),這個管理程序可以管理多個數據庫。 2.一個數據庫中可以創建多個表,以保存數據(信息)。【數據…

[深度學習]目標檢測基礎

目錄 一、實驗目的 二、實驗環境 三、實驗內容 3.1 LM_BoundBox 3.1.1 實驗代碼 3.1.2 實驗結果 3.2 LM_Anchor 3.2.1 實驗代碼 3.2.2 實驗結果 3.3 LM_Multiscale-object-detection 3.3.1 實驗代碼 3.3.2 實驗結果 四、實驗小結 一、實驗目的 了解python語…

ALOHA機器人平臺:低成本、高精度雙臂操作及其進展深度解析

原創1從感知決策到具身智能的技術躍遷與挑戰(基座模型與VLA模型)2ALOHA機器人平臺:低成本、高精度雙臂操作及其進展深度解析3(上)通用智能體與機器人Transformer:Gato和RT-1技術解析及與LLM Transformer的異同4(下)通用智能體與機器人Transformer&#x…

C++: 類 Class 的基礎用法

🏷? 標簽:C、面向對象、類、構造函數、成員函數、封裝、繼承、多態 📅 更新時間:2025年6月15日 💬 歡迎在評論區留言交流你的理解與疑問! 文章目錄 前言一、什么是類?二、類的定義1.基本語法2.…

Java EE與Jakarta EE命名空間區別

在 Java 生態中,javax 和 jakarta 代表了 企業級 Java 規范(Java EE/Jakarta EE)的命名空間演進,核心區別在于歸屬權和管理組織的變更。以下是詳細對比: 1. 歷史背景 javax: 源自 Java EE(Java …

2 Studying《Arm A715 Technical Reference Manual》

目錄 2. The Cortex?A715 core 2.1 Cortex?A715 core features 2.2 Cortex?A715 core confifiguration options 2.3 DSU-110 dependent features 2.4 Supported standards and specifications 2.6 Design tasks 3. Technical overview 3.1 Core components 3.2 Int…

使用Nodejs嘗試小程序后端服務編寫:簡單的待辦事項管理demo

文章目錄 結構demo步驟demo運行效果API測試(1) 添加待辦事項(2) 獲取所有待辦事項(3) 切換完成狀態(4) 刪除待辦事項 API測試-RESTClient一些其他的高級功能環境變量管理不同環境配置授權認證 測試需要登錄的接口保存響應測試腳本編寫自動化測試 bug解決 結構 嘗試寫一個簡單的…

CSS“多列布局”

多列布局是一種非常常見的布局方式,適用于內容豐富的頁面,如新聞網站、雜志或博客。 一、CSS多列布局概述 CSS多列布局允許我們將內容分成多個垂直列,使頁面布局更加靈活和多樣化。多列布局的主要屬性包括 ??column-count??、??col…

Pump上狙擊機制的功能優勢和實戰教學

加密世界的發展永遠伴隨著速度的革命。無論是新的 Token 上線,還是熱點項目的第一波流動性注入,搶先一步往往意味著利潤的幾何級增長。在這個講究「秒殺」與「先機」的賽道中,一項關鍵策略正悄然成為鏈上操作者的常規武器——狙擊&#xff08…

條件收斂的級數中項必須趨于 0,正負項抵消,但趨于 0 的速度不需要“足夠快”

條件收斂的級數中,項必須趨于 0,但趨于 0 的速度不需要“足夠快”的原因可以從以下幾個方面理解: 1. 收斂的必要條件:項趨于 0 對于任何收斂的級數(無論是絕對收斂還是條件收斂),都必須滿足 li…

Tomcat 和 Spring MVC

Tomcat 和 Spring MVC 是 Java Web 開發中兩大核心組件,分別承擔不同的角色: 一、Tomcat 定義 Apache Tomcat 是一個開源的 Servlet 容器(也稱為 Servlet 引擎)+ JSP 引擎,實現了 Java EE(現稱 …

【微服務】134:SpringCloud

今天是劉小愛自學Java的第134天。 感謝你的觀看,謝謝你。 image 學習內容安排如下: SpringCloud的接觸。利用SpringCloud搭建微服務架構,當然這個估計要3天時間才能完成,今天主要是注冊中心Eureka的學習。 一、SpringCloud 微服務…

三次貝塞爾曲線,二次貝塞爾曲線有什么區別

三次貝塞爾曲線和二次貝塞爾曲線在控制點數量、數學表達式和曲線復雜度上有所不同。以下是它們的主要區別: 1. 控制點數量 二次貝塞爾曲線:由3 個點定義(起點、終點和 1 個控制點)。三次貝塞爾曲線:由4 個點定義&…

springboot集成dubbo

BeanDefinitionRegistryPostProcessor public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {/*** 允許開發者在Spring容器加載Bean定義(BeanDefinition)后,實例化Bean之前,動態修改或注冊新的BeanDefinition* 該接…

Seata 全面深入學習指南

Seata 全面深入學習指南 學習目錄 第一部分:Seata 基礎篇 分布式事務基礎概念Seata 概述與核心架構Seata 部署與快速入門第二部分:Seata 核心機制 Seata 事務模式詳解 AT 模式TCC 模式SAGA 模式XA 模式Seata 事務協調機制Seata 高可用設計第三部分:Seata 高級特性 Seata 配…

【Linux】基于策略模式的簡單日志設計

📝前言: 這篇文章我們來講講Linux——基于策略模式的簡單日志設計 🎬個人簡介:努力學習ing 📋個人專欄:Linux 🎀CSDN主頁 愚潤求學 🌄其他專欄:C學習筆記,C語…

C#引用傳遞代碼記錄

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 值傳遞和引用傳遞 {internal class Program{static void Main(string[] args){person P1new person();P1.name "張三";person P2 …