常用設計模式系列(十四)—模板方法模式

常用設計模式系列(十四)—模板方法模式

第一節

前言

之前我完成了創建型設計模式和結構型設計模式,我們今天將踏入設計模式的第三章:行為型設計模式,你是否還記得什么是行為型設計模式嗎?行為型模式:用于描述類或對象之間怎樣相互協作共同完成單個對象都無法單獨完成的任務,以及怎樣分配職責。今天開始講解第一篇,模板方法模式,所謂模板,就是定義相同的模板規范,去構建固定行為與可擴展行為,每個可擴展行行為可以有自己的特點。

第二節

模板方法模式

模板方法模式(Template
Method):一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但調用將以抽象類中定義的方式進行。這種類型的設計模式屬于行為型模式。

個人理解(Person
Understand):抽象類可以定義一些普通方法及抽象方法,普通方法按照自己的規范進行定義即定義流程,但是流程中的每個步驟都可以在子節點進行特例化處理,在上層定義規范,在下層在規范的基礎上進行特殊化處理。

模板方法模式構成:

在這里插入圖片描述

在這里插入圖片描述

小楊同學入職后,需要去銀行辦理一張工資卡,來到銀行后,銀行提供了兩種辦卡方式,第一為人工辦理、第二種為機器自助辦理,可根據自己的選擇完成辦卡。辦卡流程為:填寫個人身份信息、人像識別、密碼設置、簽名留存。使用機器和人工都可以完成卡的辦理。銀行所定義的開卡流程就是我們模板方法模式中的,抽象模板類用來定義流程,那么人工辦卡和機器自主辦卡則是兩種具體實現類。

在這里插入圖片描述

image

第三節

代碼實現

1.編寫抽象模板類

package com.yang.templatemethod;/*** @ClassName AbstractOpenCar* @Description 抽象模板類-開卡* @Author IT小白架構師之路* @Date 2021/1/5* @Version 1.0**/
public abstract class AbstractOpenCar {//開卡public void  openCar(String password){writeInfo();faceDistinguish();givePass(password);autograph();}/*** 填寫個人信息*/public abstract void writeInfo();/*** 人臉識別*/public void faceDistinguish(){System.out.println("識別人臉:人臉識別系統");}//設置密碼public void givePass(String password){System.out.println("設置密碼:密碼設置為"+password);}//簽名public abstract void autograph();}

2.編寫具體子類A

package com.yang.templatemethod;/*** @ClassName ArtificialOpen* @Description 人工開卡* @Author IT小白架構師之路* @Date 2021/1/5* @Version 1.0**/
public class ArtificialOpen extends AbstractOpenCar{@Overridepublic void writeInfo() {System.out.println("信息填寫:提供個人信息,銀行業務人員幫忙錄入");}@Overridepublic void autograph() {System.out.println("簽名確認:紙質簽名確認");}
}

3.編寫具體子類B

package com.yang.templatemethod;/*** @ClassName AutonomyOpen* @Description 機器自助開卡* @Author IT小白架構師之路* @Date 2021/1/5* @Version 1.0**/
public class AutonomyOpen extends AbstractOpenCar{@Overridepublic void writeInfo() {System.out.println("信息填寫:機器手動填寫個人信息");}@Overridepublic void autograph() {System.out.println("簽名確認:電子簽名確認");}
}

4.測試客戶端

package com.yang.templatemethod;/*** @ClassName Client* @Description 客戶端測試* @Author IT小白架構師之路* @Date 2021/1/5* @Version 1.0**/
public class Client {public static void main(String[] args) {AbstractOpenCar openCar = new ArtificialOpen();System.out.println("選擇人工開卡-----------");openCar.openCar("123789");System.out.println("結束人工開卡-----------");openCar = new AutonomyOpen();System.out.println();System.out.println("選擇自助開卡-----------");openCar.openCar("147258");System.out.println("結束自助開卡-----------");}
}

5.程序運行結果如下,程序使用銀行兩種開卡方式完成了模板方法模式

選擇人工開卡-----------
信息填寫:提供個人信息,銀行業務人員幫忙錄入
識別人臉:人臉識別系統
設置密碼:密碼設置為123789
簽名確認:紙質簽名確認
結束人工開卡-----------選擇自助開卡-----------
信息填寫:機器手動填寫個人信息
識別人臉:人臉識別系統
設置密碼:密碼設置為147258
簽名確認:電子簽名確認
結束自助開卡-----------

第四節

優缺點及適用場景
優點

1.模板模式既定義了固定的流程,又支持了擴展功能,將固定的不可修改的在父類定義,子類去實現擴展的功能。

2.父類提供的公共方法,也便于代碼復用

3.擴展的方法,父類不實現,交給了子類,子類可以通過繼承的方式增加功能,符合了設計模式中的開閉原則。

缺點

1.如果要定義不同的實現,則需要創建新的實現類,業務增多時會增加類的數量,增加了系統的復雜性。

2.因為是通過繼承實現的,如果父類增加新的流程規范(抽象方法),所有的子類都要修改源碼來實現。

適用場景

1.當需要一個父類定義流程規范,但需要子類去實現的算法,父類負責不變的模塊,子類負責擴展的模塊時。

2.需要控制子類的擴展時(定義規范)。

3.需要將多個子類中的公共模塊抽象提取出來到父類,解決代碼冗余時。

4.例如我們JavaWeb開發過程中使用的servlet、filter都是使用了模板方法。

掃描二維碼

關注我吧

IT小白架構師之路

image

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

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

相關文章

DoRA詳解:從LoRA到權重分解的進化

DoRA??是一種用于??大語言模型(LLM)微調??的技術,全稱為 ??"Weight-Decomposed Low-Rank Adaptation"??(權重分解的低秩自適應)。它是對現有微調方法(如 ??LoRA??)的改…

RocksDB關鍵設計詳解

0 說明 近日工作中使用了 RocksDB。RocksDB 的優點此處無需多說,它的一個 feature 是其有很多優化選項用于對 RocksDB 進行調優。欲熟悉這些參數,必須對其背后的原理有所了解,本文主要整理一些 RocksDB 的 wiki 文檔,以備自己參考…

Kotlin -> 普通Lambda vs 掛起Lambda

1. 普通Lambda vs 掛起Lambda的本質區別 1.1 普通Lambda&#xff08;同步執行&#xff09; val lambda: (Int) -> String { it.toString() }// 編譯器生成&#xff1a; class Lambda$1 : Function1<Int, String> {override fun invoke(p1: Int): String {return p1.t…

Apache Ignite 中如何配置和啟用各類監控指標

這段文檔是關于 Apache Ignite 中如何配置和啟用各類監控指標&#xff08;Metrics&#xff09; 的詳細說明。核心思想是&#xff1a;“指標收集有性能開銷&#xff0c;因此默認不開啟所有指標&#xff0c;需要你按需手動開啟。” 下面我們來逐層拆解、通俗易懂地理解這些內容。…

uniapp x swiper/image組件mode=“aspectFit“ 圖片有的閃現后黑屏

部分安卓機針對大寫.JPG 有的豎圖正常&#xff0c;橫圖/正方形不對。解決方案&#xff1a;加border-radius: 1rpx;就行<!-- 圖片預覽彈出框 --><fui-backdrop v-model:visible"imgPreviewVisible" :closable"true" onclick"imgPreviewVisibl…

conda安裝jupter

conda自帶的jupter本來在base里沒有在pytorch環境中 安裝jupter conda install nb_conda 此擴展程序在 Jupyter 文件瀏覽器中添加了一個 Conda 選項卡。選擇 Conda 選項卡將顯示&#xff1a; 當前存在的 Conda 環境列表當前配置的通道中可用的 Conda 包列表&#xff08;htt…

嵌入式操作系統快速入門(1):快速入門操作系統常見基礎概念

快速體會操作系統常見基礎概念 1 初識基本概念 1.1 操作系統 一個軟件程序&#xff1b;用于解決計算機多任務執行時的資源爭搶問題&#xff1b;管理計算機中的各種資源&#xff0c;確保計算機正常完成各種工作&#xff08;任務&#xff09;&#xff0c;解決多任務環境中任務的調…

網絡安全-同形異義字攻擊:眼見并非為實(附案例詳解)

什么是同形異義字攻擊&#xff1f;對人眼而言&#xff0c;一切看起來完全正常。但實際上&#xff0c;例如單詞 Ηоmоgraph 并不完全等同于單詞 Homograph。它們之間的差異非常細微&#xff0c;難以察覺。Ηоmоgraph 實際上包含了幾個非拉丁字母。在本例中&#xff0c;我們將…

windows服務器 maven 配置環境變量,驗證maven環境變量是否配置成功

前置條件&#xff1a;先確認對應版本的jdk已安裝配置好&#xff0c;可使用java -version檢測; 我使用的apache-maven-3.6.3是對應jdk1.8 1.找到系統變量配置窗口 以windows server2019為例&#xff0c;右鍵計算機屬性&#xff0c; 高級系統設置–》環境變量–》系統變量2.新建M…

安裝 docker compose v2版 筆記250731

安裝 docker compose v2版 筆記250731 簡述 v2版是插件形式 確認系統要求, 已安裝 Docker Engine&#xff08;版本 20.10.5 或更高&#xff09; 安裝方式可分為 apt 或 yum 安裝 (能自動升級) apt install docker-compose-pluginyum install docker-compose-plugin 手動二…

PHP 5.5 Action Management with Parameters (English Version)

PHP 5.5 Action Management with Parameters (English Version) Here’s a PHP 5.5 compatible script that uses URL parameters instead of paths for all operations: <?php // Start session for persistent storage session_start();// Initialize the stored actio…

GR-3(4B) 技術報告--2025.7.23--字節跳動 Seed

0. 前言 前兩天字節發布了GR-3&#xff0c;粗略的看了一下&#xff0c;在某些方面超過了SOTA pi0&#xff0c;雖然不開源&#xff0c;但是也可以來看一看。 官方項目頁 1. GR-3模型 1.1 背景 在機器人研究領域&#xff0c;一直以來的目標就是打造能夠幫助人類完成日常任務…

Linux網絡編程:UDP 的echo server

目錄 前言&#xff1a; 一、服務端的實現 1、創建socket套接字 2、綁定地址信息 3、執行啟動程序 二、用戶端的實現 總結&#xff1a; 前言&#xff1a; 大家好啊&#xff0c;前面我們介紹了一些在網絡編程中的一些基本的概念知識。 今天我們就借著上節課提到的&#…

AI+金融,如何跨越大模型和場景鴻溝?

文&#xff5c;白 鴿編&#xff5c;王一粟當AI大模型已開始走向千行百業之時&#xff0c;備受看好的金融行業&#xff0c;卻似乎陷入了落地瓶頸。打開手機銀行想查下貸款額度&#xff0c;對著屏幕說了半天&#xff0c;AI客服卻只回復 “請點擊首頁貸款按鈕”&#xff1b;客戶經…

深度解析:從零構建跨平臺對象樹管理系統(YongYong框架——QT對象樹機制的現代化替代方案)

一、技術背景與核心價值 1.1 QT對象樹的局限性 在Qt框架中&#xff0c;QObject通過對象樹機制實現了革命性的對象管理&#xff1a; #mermaid-svg-SvqKmpFjg76R02oL {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Sv…

力扣46:全排列

力扣46:全排列題目思路代碼題目 給定一個不含重復數字的數組 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 思路 看到所有可能首先想到的就是回溯。 回溯的結束條件也很好寫&#xff0c;用數組的長度來判斷即可。這道題的難點主要是如何進行判…

mac環境配置rust

rustup 是一個命令行工具&#xff0c;用于管理 Rust 編譯器和相關工具鏈 sh 體驗AI代碼助手 代碼解讀復制代碼curl --proto ‘https’ --tlsv1.2 -sSf https://sh.rustup.rs | sh使得 Rust 的安裝在當前 shell 環境中生效 如果你使用的是 bash, zsh 或其他類似的 shell&#xf…

腳手架搭建React項目

腳手架搭建項目 1. 認識腳手架工具 1.1. 前端工程的復雜化 1.1.1. 如果只是開發幾個小的demo程序&#xff0c;那么永遠不要考慮一些復雜的問題&#xff1a; 比如目錄結構如何組織劃分&#xff1b;比如如何關鍵文件之間的相互依賴&#xff1b;比如管理第三方模塊的依賴&#xff…

Golang 調試技巧:在 Goland 中查看 Beego 控制器接收的前端字段參數

&#x1f41b; Golang 調試技巧&#xff1a;在 Goland 中查看 Beego 控制器接收的前端字段參數 在使用 Beego 開發 Web 項目時&#xff0c;我們常常會在控制器中通過 c.GetString()、c.GetInt() 等方法獲取前端頁面傳過來的字段值。而在調試過程中&#xff0c;如何在 Goland 中…

sqli-labs:Less-2關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入類型&#xff1a;數值型提示&#xff1a;參數id無需考慮閉合問題&#xff0c;相對簡單 2. 手工注入步驟&#x1f3af; 我的地址欄是&#xff1a;http://l…