設計模式使用場景實現示例及優缺點(行為型模式——模板方法模式)

模板方法模式(Template Method Pattern)

模板方法模式(Template Method Pattern)是一種行為設計模式,它定義了一個操作中的算法的骨架,將算法的一些步驟延遲到子類中。這樣可以在不改變算法的結構的前提下,重新定義算法的某些特定步驟。

核心組件

  • AbstractClass(抽象類):這是一個抽象基類,它定義了一套算法的模板。它實現了模板方法,定義了算法的骨架,具體步驟由子類實現。
  • ConcreteClass(具體類):這些類繼承自抽象基類,并實現其算法中的具體步驟。

適用場景

  1. 一次性實現算法的不變部分
    • 當算法的大部分結構固定不變,但某些步驟具有多變性時,可使用模板方法模式。
  2. 各子類中公共行為應提取到單一位置避免代碼重復
    • 通過模板方法模式,可以將公共行為提取到超類中,通過繼承機制復用這部分代碼。
  3. 控制子類擴展
    • 模板方法模式通過將算法的核心流程固化在超類中,防止子類破壞原有算法的結構。

實現實例

以一個簡單的游戲開發為例,其中游戲的基本結構(啟動、開始、結束)是固定的,但具體每個階段的實現可以根據不同類型的游戲變化。使用模板方法模式可以固定游戲的主體流程,而將具體步驟的實現留給子類:

抽象類(Abstract Class)

這個類定義了游戲的基本流程,并將具體實現留給子類。

public abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();// 模板方法public final void play() {initialize();  // 初始化游戲startPlay();   // 開始游戲endPlay();     // 結束游戲}
}
具體類(Concrete Classes)

這些類繼承自抽象基類,并實現了其具體的操作。

public class Cricket extends Game {@Overridevoid initialize() {System.out.println("Cricket Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Cricket Game Started. Enjoy the game!");}@Overridevoid endPlay() {System.out.println("Cricket Game Finished!");}
}public class Football extends Game {@Overridevoid initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Football Game Started. Enjoy the game!");}@Overridevoid endPlay() {System.out.println("Football Game Finished!");}
}
客戶端代碼(Client Code)

這部分代碼演示了如何使用模板方法模式來規范游戲的流程。

public class Client {public static void main(String[] args) {Game game = new Cricket();game.play();  // 按照Cricket的流程執行游戲game = new Football();game.play();  // 按照Football的流程執行游戲}
}

優缺點

優點
  1. 提高代碼復用性
    • 將通用部分的代碼放在抽象的父類中,減少了子類的重復代碼。
  2. 擴展性好
    • 新增具體類時,只需實現算法的可變部分,不需修改已有的代碼。
  3. 控制子類擴展
    • 可以在超類中定義嚴格的算法規則,限定子類的行為和結構。
缺點
  1. 對繼承的依賴
    • 模板方法模式通過繼承來實現,可能會導致過多的類層次。
  2. 可能違背Liskov替換原則
    • 如果子類不適當地實現父類的方法,可能會違背Liskov替換原則。

類圖

+----------------+         +------------------+
|   AbstractClass|-------->|   ConcreteClass  |
+----------------+         +------------------+
| + templateMethod()       | + step1()        |
| + step1()                | + step2()        |
| + step2()                +------------------+
| + step3()                |
+----------------+         |
| + step3()                |
+----------------+         ||+-------------------+||                   |
+---------------+ +-----------------+
|ConcreteClassA | |ConcreteClassB   |
+---------------+ +-----------------+
| + step1()     | | + step1()       |
| + step2()     | | + step2()       |
| + step3()     | | + step3()       |
+---------------+ +-----------------+

注意事項

設計靈活性與復雜性:

模板方法模式雖然提高了代碼的復用性,但也可能導致設計過于復雜。在設計時應確保不過度使用,以免造成系統的不必要復雜。

子類的設計約束:

子類實現時必須遵循抽象基類的方法模板,這限制了子類的靈活性。設計者需要在提供足夠的靈活性和維持算法結構之間找到平衡。

重構與維護:

如果模板方法本身需要修改,可能會影響到所有的子類。因此,在模板方法中應盡量減少修改的可能性,確保長時間的穩定性。

總結

模板方法模式是一種強大的設計工具,通過預定義算法的結構,提供了高度的復用性和擴展性。它不僅適用于軟件開發,還廣泛應用于系統設計和業務流程管理。通過對模式的適當擴展和優化,可以有效應對更加復雜和動態的設計挑戰。這種模式的成功實施需要深入理解業務需求和技術上的靈活運用,以確保設計的可維護性和系統的可擴展性。

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

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

相關文章

Git使用介紹教程

Git使用介紹教程 小白第一次寫博客,內容寫的可能不是很詳細,僅供參考,大家一起努力 gitee網址:https://gitee.com 大部分的開發團隊都以 Git 作為自己的版本控制工具,需要對 Git 的使用非常的熟悉。這篇文章中本人整理了自己在開發過程中經常使用到的 Git 命令,方便在偶…

jenkins系列-06.harbor

https://github.com/goharbor/harbor/releases?page2 https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz harbor官網:https://goharbor.io/ 點擊 Download now 鏈接,會自動跳轉到上述github頁面&am…

C++ | Leetcode C++題解之第233題數字1的個數

題目: 題解: class Solution { public:int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代碼中,可以發現 k 并沒有被直接使用到(都是使用 10^k)// 但為了讓代碼看起來更加直觀,這里保留了 klong l…

Redis系列命令更新--Redis哈希命令

一、設置密碼驗證: 使用文本編輯器,這里使用Notepad,打開Redis服務配置文件。 注意:不要找錯了,通常為redis.windows-service.conf,而不是redis.windows.conf。后者是以非系統服務方式啟動程序使用的配置…

使用個人p12證書請求https接口數據

依賴 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version></dependency>code package com.hexin.cbas.test;import org.apache.commons.net.util.TrustM…

《BASeg: Boundary aware semantic segmentation for autonomous driving》論文解讀

期刊&#xff1a;Neural Networks | Journal | ScienceDirect.com by Elsevier 年份&#xff1a;2023 代碼&#xff1a;https://github.com/Lature-Yang/BASeg 摘要 語義分割是自動駕駛領域街道理解任務的重要組成部分。現有的各種方法要么專注于通過聚合全局或多尺度上下文…

曠野之間20 - Google 研究的推測 RAG

為什么選擇 RAG 新興能力 直到最近&#xff0c;人們發現 LLM 具有新興能力&#xff0c;即在與用戶或任務交互過程中出現的意外功能。 這些功能的示例包括&#xff1a; 解決問題&#xff1a; LLM 可以利用其語言理解和推理能力&#xff0c;為未經過明確培訓的任務提供富有洞…

js的原型鏈

原型鏈: 1.如何構成原型鏈&#xff1f; 2.原型鏈上屬性的增刪改查。 3.絕大多數對象的最終都會繼承自Object.prototype (var obj Object.create(null或者undefined)沒有原型)。 4.Object.create(原型)。 構成原型鏈和操作原型鏈屬性&#xff1a; //最頂的原型是Object.pro…

性能優化篇:SQL數據庫查表速度優化

SQL數據庫查詢的性能優化是確保數據庫能夠快速響應和高效處理請求的關鍵。以下是一些常見的SQL數據庫查詢性能優化方法: 索引優化: 創建適當的索引:為經常在WHERE子句中使用的列、JOIN操作涉及的列以及排序操作涉及的列創建索引。避免過多的索引:雖然索引可以提高查詢速度,…

python的字符串

字符串 簡單操作 創建 利用 ‘ ’ 或 “ ” 將字符或數字包裹起來的都為字符串 a"你好" 格式化字符串 元組的字符格式化 字符串格式化函數 srt.format() f格式化 方法 split()//指定分割符經行分割 strip()//指定移除字符頭尾的字符 join()//指定序列中的字符連接成新…

【Perl】Perl 語言入門

1. Perl語言介紹 Perl 是一種高級、解釋型、動態編程語言&#xff0c;由Larry Wall在1987年發布。Perl 以其強大的文本處理能力而聞名&#xff0c;特別是在處理報告生成、文件轉換、系統管理任務等方面。它吸收了C、Shell腳本語言、AWK、sed等語言的特性&#xff0c;并加入了大…

Go:常量運算符流程控制

目錄 一、常量 1.1 常量基本定義 1.2 常量組的定義 1.3 常量枚舉 二、運算符 2.1 算數運算符 2.2 關系運算符 2.3 邏輯運算符 2.4 位運算符 2.5 賦值運算符 2.6 指針運算符 2.7 運算符優先級 三、流程控制 3.1 if-else 條件語句 3.2 switch-case語句 3.3 for 循…

5、 測試

這里寫目錄標題 1、自動化測試簡介&#xff08;1&#xff09;自動化測試是什么&#xff08;2&#xff09;為什么要寫測試測試節約你的時間發現錯誤&#xff0c;預防錯誤測試使得代碼更有吸引力 2、基礎測試策略3、開始寫第一個測試&#xff08;1&#xff09;首先得有個bug&…

Not Invented Here 不是在這里發明的 / Proudly found elsewhere 自豪地在其他地方找到

注&#xff1a; 機翻&#xff0c;未校對。 兩篇關于創新管理的小文章 Not Invented Here 不是在這里發明的 In the history of organizational success, the enterprises that dominate tend to flawlessly execute on ideas that were created elsewhere. Examine just abo…

智慧水利解決方案:從理論到實踐的全面跨越,展示其在水資源管理、水災害預警、水生態保護等方面的創新應用

目錄 一、引言&#xff1a;智慧水利的時代背景與意義 二、智慧水利的理論框架與技術體系 1、理論框架 2、技術體系 三、智慧水利在水資源管理中的應用 1、水資源優化配置 2、水量水質協同管理 四、智慧水利在水災害預警中的應用 1、洪水預警與應急響應 2、干旱監測與評…

git 創建分支--命令行

在Git中創建分支是一個相對簡單且重要的操作&#xff0c;它允許開發者在不影響主代碼庫的情況下進行開發或修復工作。以下是創建Git分支的步驟&#xff1a; 一、基本步驟 打開命令行終端&#xff1a; 首先&#xff0c;需要打開命令行終端&#xff08;在Windows上可以是CMD、Po…

Mediapipe-姿態估計實例

Mediapipe簡介 Mediapipe 是由 Google Research 開發的一款開源框架&#xff0c;旨在幫助開發者輕松地構建、測試和部署復雜的多模態、多任務的機器學習模型。它特別擅長于實時處理和分析音頻、視頻等多媒體數據。以下是 Mediapipe 的一些關鍵特點和組件&#xff1a; 關鍵特點…

基于微信小程序的音樂播放平臺

基于微信小程序的音樂播放平臺 音樂播放小程序項目簡介技術棧功能模塊項目流程系統E-R圖項目頁面 音樂播放小程序 項目簡介 微信音樂小程序旨在提供一個簡潔高效的音樂播放平臺&#xff0c;用戶可以方便地搜索、播放和收藏自己喜歡的音樂。整個項目采用前后端分離的架構&…

WIN10開機突然,過一會就自動重啟藍屏DRIVER_IRQL_NOT_LESS_OR_EQUAL

環境&#xff1a; Win10 專業版 DELL7080 問題描述&#xff1a; WIN10開機突然&#xff0c;過一會就自動重啟藍屏DRIVER_IRQL_NOT_LESS_OR_EQUAL 事件日志 解決方案&#xff1a; 1.找到MEMORY.DMP文件內容&#xff0c;分析一下 Microsoft (R) Windows Debugger Version 10…

主機安全-開源HIDS字節跳動Elkeid安裝使用

目錄 概述什么是HIDSHIDS與NIDS的區別EDR、XDR是啥&#xff1f; Elkeid架構Elkeid Agent && Agent centerElkeid DriverElkeid RASPElkeid HUBService DiscoveryManager安裝數據采集規則&告警 參考 概述 什么是HIDS HIDS&#xff08; host-based intrusion detec…