掌握java模板方法模式,提升代碼復用與擴展的藝術

Java 模板方法模式是一種行為型設計模式,它定義了一個算法的骨架,并將一些步驟延遲到子類中實現。模板方法模式使得子類可以在不改變算法結構的情況下重定義算法中的某些步驟。
使用場景

  • 算法骨架固定:如果一個算法的基本結構已經固定,但具體的實現步驟可能因為不同的場景而不同,這個時候可以使用模板方法模式。
  • 實現代碼復用:如果有多個類的某些方法結構相似,但是實現細節不同,這個時候可以將這些相同的結構抽象到父類中,由子類來實現不同的細節。
  • 簡化代碼實現:模板方法模式可以將復雜的代碼實現分離成幾個簡單的步驟,從而降低代碼實現的難度和復雜度。
  • 框架和庫的設計:模板方法模式是設計框架和庫的重要方式之一,它可以提供統一的接口和標準的實現流程,方便用戶進行擴展和定制

代碼示例

AbstractClass 是一個抽象類,它定義了算法的骨架,其中 templateMethod() 是模板方法,它定義了算法的流程,由一些抽象方法 primitiveOperation1() 和 primitiveOperation2() 組成。
??ConcreteClass 是 AbstractClass 的具體子類,它實現了抽象方法,定義了具體的算法細節。在客戶端使用時,創建 ConcreteClass ,然后調用其 templateMethod() 方法,即可完成算法的執行。
代碼示例如下:
抽象類,定義算法骨架:

public abstract class AbstractClass {// 模板方法,定義算法流程public final void templateMethod() {primitiveOperation1();primitiveOperation2();}// 抽象方法1,由子類實現public abstract void primitiveOperation1();// 抽象方法2,由子類實現public abstract void primitiveOperation2();
}

具體子類,實現具體的算法細節:


public class ConcreteClass extends AbstractClass {@Overridepublic void primitiveOperation1() {System.out.println("ConcreteClass.primitiveOperation1()");}@Overridepublic void primitiveOperation2() {System.out.println("ConcreteClass.primitiveOperation2()");}
}

客戶端使用:

public class Client {public static void main(String[] args) {AbstractClass abstractClass = new ConcreteClass();abstractClass.templateMethod();}
}

需要注意的是,在模板方法模式中,模板方法通常被聲明為 final,以防止子類對其進行重寫。同時,由于模板方法是一個抽象方法,因此在實現時需要注意不同抽象方法的實現順序,以確保算法的正確性。

Spring 中的 JdbcTemplate

  1. 在 JdbcTemplate 類中,定義一個 execute 方法,該方法接收一個 ConnectionCallback 或 StatementCallback 對象作為參數。這些回調對象實現了具體的數據庫操作邏輯。
  2. 在 execute 方法中,根據傳入的回調對象類型,創建相應的 PreparedStatement 或 Statement 對象,并調用回調對象的 doInConnection 或 doInStatement 方法執行具體的數據庫操作。
  3. 將數據庫連接、PreparedStatement 或 Statement 對象等資源關閉的操作封裝在 finally 代碼塊中,確保資源能夠被正確釋放。
    代碼如下:
public <T> T execute(ConnectionCallback<T> action) throws DataAccessException {Assert.notNull(action, "Callback object must not be null");Connection con = DataSourceUtils.getConnection(obtainDataSource());try {Connection conToUse = createConnectionProxy(con);return action.doInConnection(conToUse);}catch (SQLException ex) {String sql = getSql(action);DataSourceUtils.releaseConnection(con, getDataSource());con = null;throw translateException("ConnectionCallback", sql, ex);}finally {DataSourceUtils.releaseConnection(con, getDataSource());}}

JdbcTemplate 類的 execute 方法接收一個 ConnectionCallback 對象作為參數,然后根據該對象執行具體的數據庫操作。這樣,JdbcTemplate 就實現了模板模式,將數據庫操作的具體邏輯封裝在 ConnectionCallback 對象中,而 JdbcTemplate 只負責管理數據庫連接和資源釋放。

優點

  • 代碼復用性:模板模式通過將類的共同部分代碼抽象出來放在父類中,使得子類只需要實現差異部分,這大大減少了子類的重復代碼。
  • 可擴展性:當需要新增功能時,可以通過子類來實現擴展,而不需要改動原有的代碼和代碼框架,這符合軟件設計的“開閉原則”,即對擴展開放,對修改封閉。
  • 靈活性:所有子類實現的是同一套算法模型,在使用模板的地方,可以通過切換不同的子類來實不同的功能,這符合“里氏替換原則”。
  • 維護性:由于模板模式的行為由父類控制,子類實現,這樣的結構清晰,有利于維護。

缺點

  • 復雜性:對于一些簡單的任務,使用模板模式可能會引入不必要的復雜性。
  • 繼承的限制:模板模式基于繼承,這意味著它可能不適用于所有的編程語言或框架,特別是那些不支持繼承的語言或框架。
  • 設計習慣:我們平常的設計習慣可能更偏向于直接實現功能,而不是先定義一個模板方法,這可能需要一定的適應時間。

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

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

相關文章

跨專業考研難度大嗎?聽聽過來人的真實經歷

在考研的大潮中&#xff0c;跨專業考研成為了一個不可忽視的現象。許多考生因為對原專業失去興趣、追求職業夢想或其他原因&#xff0c;選擇了跨專業報考。那么&#xff0c;跨專業考研的難度究竟有多大呢&#xff1f;今天&#xff0c;我們就來聊聊這個話題&#xff0c;聽聽過來…

不是我吹,這8道HashMap面試題讓你面試時對答如流

前言 又到了一年一度的金三銀四面試季&#xff0c;我們拿著自己的面試秘籍去面試&#xff0c;但是面試官的問題五花八門&#xff0c;讓我們摸不清他們的套路。今天我就總結了面試時必問的hashmap面試題&#xff0c;無論面試官怎么問&#xff0c;我們都對答如流。 另外本人整理了…

java小記(2)

IS-A&#xff1a;類的父子繼承關系。 default&#xff1a;關鍵字&#xff0c;與Java中的public&#xff0c;private等關鍵字一樣&#xff0c;都屬于修飾符關鍵字&#xff0c;可以用來修飾屬性、方法以及類&#xff0c;但是default一般用來修飾接口中的方法。 接口與抽象類的區…

代碼隨想錄算法訓練營第二十四天 | 77. 組合

回溯算法理論基礎 https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 回溯法也可以叫做回溯搜索法&#xff0c;它是一種搜索的方式。 回溯是遞歸的副產品&#xff0c;只要有遞歸就會有回溯。 回溯法并不是什么高效的…

馬斯克正式起訴OpenAI和奧特曼!

就在剛剛&#xff0c;馬斯克鬧出來一件大事——正式起訴OpenAI和Sam Altman&#xff0c;并要求OpenAI 恢復開源GPT-4等模型&#xff01; 眾所周知&#xff0c;馬斯克這兩年一只在推特上指責 OpenAI是CloseAI(不開源)&#xff0c;但都只是停留在口頭上。 而這次馬斯克動了真格。…

nginx if 指令

目錄 nginx if 指令直接判斷變量判斷是否等于字符串判斷變量是否匹配正則表達式文件及目錄判斷示例1&#xff1a;判斷index.html是否存在示例2&#xff1a;判斷URL中是否存在某個參數Parameter示例3&#xff1a;判斷URI中是否為某個特定路徑示例4&#xff1a;開放白名單內的功能…

從0開始python學習-53.python中flask創建簡單接口

目錄 1. 創建一個簡單的請求,沒有寫方法時默認為get 2. 創建一個get請求 3. 創建一個post請求&#xff0c;默認可以使用params和表單傳參 4. 帶有參數的post請求 1. 創建一個簡單的請求,沒有寫方法時默認為get from flask import Flask, request# 初始化一個flask的對象 ap…

RK3566 linux iperf網絡測試

一、開發環境 系統:buildroot&#xff1b; 在Linux目標板和Windows PC上運行iperf進行測試&#xff1b; 二、調試 1、查詢目標板上的iperf 使用終端助手連接目標板&#xff0c;然后輸入命令查詢iperf的版本&#xff1a; rootrk3566-buildroot:~# iperf -v iperf version …

圖數據庫 之 Neo4j - 應用場景3 - 知識圖譜(8)

背景 知識圖譜的復雜性:知識圖譜通常包含大量的實體、關系和屬性,以及它們之間的復雜關聯。傳統的關系型數據庫在處理這種復雜性時可能面臨性能和靈活性的挑戰。 圖數據庫的優勢:圖數據庫是一種專門用于存儲和處理圖結構數據的數據庫。它們使用節點和邊來表示實體和關系,并…

USB - Battery Charing

Getting to the bottom of USB Battery Charging (了解 USB 電池充電的真相) 如今&#xff0c;幾乎所有帶電池的產品都被期望支持 BC1.2 USB 充電標準。 Today, almost every product with a battery is expected to support the BC1.2 standard for USB charging. 這對消費者來…

詳解字符串函數<string.h>(上)

1. strlen函數的使用和模擬實現 size_t strlen(const char* str); 1.1 函數功能以及用法 字符串長度 strlen函數的功能是計算字符串的長度。在使用時&#xff0c;要求用戶傳入需要計算長度的字符串的起始位置&#xff0c;并返回字符串的長度。 #include <stdio.h> #…

基于SSM醫院電子病歷管理系統的設計與實現(源代碼+數據庫腳本+萬字文檔+PPT)

系統介紹 醫院電子病歷管理系統主要是借助計算機&#xff0c;通過對醫院電子病歷管理系統所需的信息管理&#xff0c;增加用戶的選擇&#xff0c;同時也方便對廣大用戶信息的及時查詢、修改以及對用戶信息的及時了解。醫院電子病歷管理系統 對用戶帶來了更多的便利&#xff0c…

Python GUI自動化定位代碼參考

一、pyautogui原始邏輯 import pyautogui # 獲取指定圖片在屏幕上的位置 image_path path/to/image.png target_position pyautogui.locateCenterOnScreen(image_path) if target_position is not None: # 獲取偏移量 offset_x 10 offset_y 10 # 計算實際點…

一文讀懂ZKFair PFP-CyberArmy的參與價值與潛力

3月2日&#xff0c;ZKFair PFP-CyberArmy 將在 Element 上正式開始Public Sale。

文件基礎和文件fd

文章目錄 預備知識C語言的文件接口系統調用文件fd 正文開始前給大家推薦個網站&#xff0c;前些天發現了一個巨牛的 人工智能學習網站&#xff0c; 通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。 點擊跳轉到網站。 預備知識 我們平時說文件就是說文件里…

1_Springboot(一)入門

Springboot&#xff08;一&#xff09;——入門 本章重點&#xff1a; 1.什么是Springboot; 2.使用Springboot搭建web項目&#xff1b; 一、Springboot 1.Springboot產生的背景 Servlet->Struts2->Spring->SpringMVC&#xff0c;技術發展過程中&#xff0c;對使…

大模型量化技術原理-SmoothQuant

近年來&#xff0c;隨著Transformer、MOE架構的提出&#xff0c;使得深度學習模型輕松突破上萬億規模參數&#xff0c;從而導致模型變得越來越大&#xff0c;因此&#xff0c;我們需要一些大模型壓縮技術來降低模型部署的成本&#xff0c;并提升模型的推理性能。 模型壓縮主要分…

強化學習(六)時序差分

時序差分&#xff08;TD&#xff09;是強化學習的核心&#xff0c;其是蒙特卡羅&#xff08;MC&#xff09;和動態規劃&#xff08;DP&#xff09;的結合。 1、TD 預測 TD 和 MC 都是利用經驗來解決預測問題。一種非平穩環境的一般訪問蒙特卡羅方法是 V ( S t ) ← V ( S t …

Python GUI開發庫之nicegui使用詳解

概要 在 Python 中,創建圖形用戶界面(GUI)應用程序通常需要大量的代碼和時間。然而,隨著 Python 生態系統的不斷發展,出現了一些簡化 GUI 開發過程的工具和庫。其中之一就是 NiceGUI 庫。本文將深入探討 NiceGUI 庫的功能、用法以及如何利用它來創建漂亮而功能豐富的 GUI…

如何使用css實現一個加載動畫

如何使用css實現一個加載動畫 有四個點 初始化為同一個顏色 每個階段 不同的透明度 刷新也不會影響初始化 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthd…