設計模式——模板設計模式(Template Method)

模板設計-base

什么是模板?

舉個簡單的例子,以AABB的格式,寫出一個詞語,你可能會想到,明明白白,干干凈凈等,
這個AABB就是一個模板,對模板心中有了一個清晰的概念之后,我們再來看今天我們的內容,模板設計。

實現思路

我們在父類中,定義處理流程的框架,子類中實現具體處理

要如何實現這樣的思路呢?

在父類中定義多個抽象方法,然后由一個模板方法來進行調用,決定如何使用這些模板方法,就形成了處理流程的框架。

子類繼承父類,只需要實現抽象方法。這樣一來模板方法就留在了父類中,各個子類都可以有自己的實現方式。

代碼實現

在這里插入圖片描述

在這里插入圖片描述

我們定義AbstractDisplay作為父類里面有open、print、close 3個抽象方法,一個display模板方法

charDisplay和StringDisplay作為AbstractDisplay的子類,去實現各自的open、print、close方法。
最終我們用子類統一去調用父類已經實現的display模板方法,查看效果。

public abstract class AbstractDisplay {/*** 交給字類實現的抽象方法(1) open*/public abstract void open();/*** 交給字類實現的抽象方法(2)print*/public abstract void print();/*** 交給字類實現的抽象方法(3)close*/public abstract void close();/*** 模板方法,先調用open在調用5次print方法,最后調用close。* 可以看出,父類中只調用抽象方法,但不實現抽象方法,具體實現交給子類。*/public final void display(){open();for (int i = 0; i < 5; i++) {print();}close();}
}

接下來讓我們看看CharDisplayStringDisplay是如何實現的。

public class CharDisplay extends AbstractDisplay{private char character;public CharDisplay(char c){this.character = c;}@Overridepublic void open() {System.out.print("<<");}@Overridepublic void print() {System.out.print(character);}@Overridepublic void close() {System.out.println(">>");}
}
public class StringDisplay extends AbstractDisplay{private String string;private Integer times;public StringDisplay(String string) {this.string = string;times = string.toCharArray().length;}@Overridepublic void open() {System.out.print("+");for (int i = 0; i < times; i++) {System.out.print("-");}System.out.println("+");}@Overridepublic void print() {System.out.println("|"+string+"|");}@Overridepublic void close() {System.out.print("+");for (int i = 0; i < times; i++) {System.out.print("-");}System.out.println("+");}
}

讓我們在Main類中調用試試看吧

public class Main3 {public static void main(String[] args) {//生成一個持有'H'的CharDisplay實例AbstractDisplay d1 = new CharDisplay('H');//生成一個持有'Hello,world.'的StringDisplay類的實例AbstractDisplay d2 = new StringDisplay("Hello,world.");//由于d1、d2都是AbstractDisplay的實例,可以調用繼承的display方法,實際的程序行為取決于CharDisplay類和StringDisplay類的具體實現d1.display();d2.display();}
}

輸出結果
在這里插入圖片描述
我們創建了一個AbstractDisplay的模板,最終卻生成了兩種不同的結果!就像AABB的模板最終可以生成明明白白和干干凈凈一樣!

恭喜你!!掌握了模板設計模式的基本使用!接下來讓我們拓展一下思路。

思路拓展

可以使邏輯處理通用化

使用 Template Method模式究竟能帶來什么好處呢?

讓我們先看看Template Method模式的類圖是什么樣的
在這里插入圖片描述

使用 Template Method模式究竟能帶來什么好處呢?

這里,它的優點是由于在父類的模板方法中編寫了算法,因此無需在每個子類中再重復編寫算法。

例如,我們沒使用 Template Method模式,而是使用文本編輯器的復制和粘貼功能編寫了多個ConcreteClass角色。此時,會出現ConcreteClass1、ConcreteClass2、Concreteclass3 等很多相似的類。編寫完成后立即發現了Bug還好,但如果是過一段時間才發現在Concreteclass1中有 Bug,該怎么辦呢?這時,我們就必須將這個 Bug的修改反映到所有的 ConcreteClass 角色中才行。

關于這一點,如果是使用 Template Method模式進行編程,當我們在模板方法中發現Bug時只需要修改模板方法即可解決問題

父類與子類之間的協助

在 Template Method模式中,父類和子類是緊密聯系、共同工作的。因此,在子類中實現父類中聲明的抽象方法時,必須要理解這些抽象方法被調用的時機。在看不到父類的源代碼的情況下想要編寫出子類是非常困難的。

模板設計-plus

練習題一

java.io.Inputstream類使用了Template Method模式。請閱讀官方文檔(JDK的API參考資料 ),從中找出需要用java.io.Inputstream 的子類去實現的方法。

練習題二

上面給出的AbstractDisplay類的display方法如下

public final void display(){....
}
這里使用了final修飾符,請問這是想表達什么意思呢?

練習題三

如果想要讓示例程序中的open、print、close方法可以被具有繼承關系的類和同一程序包中的類調用,但是不能被無關的其他類調用,應當怎么做呢?

練習題四

Java中的接口與抽象類很相似。接口同樣也是抽象方法的集合,但是在TemplateMethod 模式中,我們卻無法使用接口來扮演AbstractClass角色,請問這是為什么呢?

答案

練習題一

查閱文檔后,你就會知道,InputStream是一個抽象類,其中需要子類實現的抽象方法只有一個就是read方法啦!
在這里插入圖片描述

在這里插入圖片描述

練習題二

final關鍵字修飾方法的時候,表示定義在父類中的模板方法display無法在子類中進行重寫,這正和我們期望的一致,我們希望模板方法由父類直接實現,即父類直接定義抽象方法的使用框架,不希望子類再去進行重寫,使用模板設計模式時,子類也不應該重寫模板方法。

練習題三

可以將AbstractDisplay類中的open,print,close方法的可見性聲明為protected。這樣就可以讓繼承該類的子類調用這些方法,而其他包中的類無法調用這些方法(不過同一個包中的類依然可以調用這些方法)。

練習題四

這是因為 TemplateMethod模式中的AbstractClass角色必須實現處理的流程。在抽象類中可以實現一部分方法(例如 AbstractDisplay類中的display方法),但是在接口中是無法實現方法的。因此,在TemplateMethod 模式中,無法用接口替代抽象類。

在Java8之前以上結論成立,在Java8之后,引入了defualt關鍵字,增強了接口的功能,使得接口也可以實現方法。

知識關聯性

Factory Method 模式(工廠模式)

是將 Template Method 模式用于生成實例的一個典型例子。

Strategy模式(策略模式)

在 Template Method 模式中,可以使用繼承改變程序的行為。這是因為 Template Method 模式在父類中定義程序行為的框架,在子類中決定具體的處理。
與此相對的是 Strategy模式,它可以使用委托改變程序的行為。與Template Method 模式中改變部分程序行為不同的是,Strategy模式用于替換整個算法。

模板設計模式(Template Method)的講解到此就結束啦,感謝閱讀。💕

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

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

相關文章

docker————docker的安裝

目錄 docker的安裝 1、安裝yum-utils工具 2、安裝yum倉庫 3、安裝docker引擎 4、設置開機啟動&#xff0c;并立即啟動 5、測試 docker的安裝 docker的官網Docker Docs 我才用的linux版本是rocky&#xff0c;使用的是最小安裝 1、安裝yum-utils工具 [rootbogon yum.rep…

環境變量(全)

概念 環境變量(environment variables)一般是指在操作系統中用來指定操作系統運行環境的一些參數 如&#xff1a;我們在編寫C/C代碼的時候&#xff0c;在鏈接的時候&#xff0c;從來不知道我們的所鏈接的動態靜態庫在哪里&#xff0c;但是照樣可以鏈接成功&#xff0c;生成可執…

今日arXiv最熱NLP大模型論文:揭露大語言模型短板,北京大學提出事件推理測試基準

人工智能領域又一里程碑時刻&#xff01;北京大學、北京智源人工智能研究院等機構聯合推出大型事件推理評測基準 。這是首個同時在知識和推理層面全面評估大模型事件推理能力的數據集。 總所周知&#xff0c;事件推理需要豐富的事件知識和強大的推理能力&#xff0c;涉及多種推…

consul啟動Error_server_rejoin_age_max (168h0m0s) - consider wiping your data dir

consul 啟動報錯&#xff1a; consul[11880]: 2024-05-12T08:37:51.095-0400 [ERROR] agent: startup error: error"refusing to rejoin cluster because server has been offline for more than the configured server_rejoin_age_max (168h0m0s) - consider wiping you…

【GD32】02-ADC模擬數字轉換器

ADC 在電子和通信技術中&#xff0c;ADC&#xff08;模擬數字轉換器&#xff09;是一種將模擬信號轉換為數字信號的電子設備。這種轉換是電子系統中非常關鍵的一個環節&#xff0c;因為數字信號更易于處理、存儲和傳輸。ADC的工作原理通常包括采樣、保持、量化和編碼等步驟。采…

http協議 tomcat如何訪問資源 servlet理論介紹

tomcat介紹 bin是啟動命令&#xff1b; conf是配置&#xff0c;可以修改端口號&#xff1b; lib是依賴的jar包&#xff1b; logs是日志 webapps是重點&#xff0c;在這里新建我們自己的javaWeb項目 tomcat如何訪問資源 tomcat通過統一資源定位符&#xff08;URL&#xff09;來…

鄉村振興與農村基礎設施建設:加大農村基礎設施建設投入,提升農村公共服務水平,改善農民生產生活條件,構建宜居宜業的美麗鄉村

一、引言 鄉村振興是我國現代化進程中的重要戰略&#xff0c;而農村基礎設施建設則是鄉村振興的基石。隨著城市化進程的加快&#xff0c;農村基礎設施建設滯后的問題日益凸顯&#xff0c;成為制約鄉村發展的瓶頸。因此&#xff0c;加大農村基礎設施建設投入&#xff0c;提升農…

打造一套在線教育系統,如何在教育這個慢行業打造品牌?

品牌對于教育行業非常重要&#xff0c;很多從事教育行業的朋友一直想塑造屬于自己的品牌形象&#xff0c;但做起來卻沒那么容易。因為教育行業相對來說是一個慢行業&#xff0c;用戶必須看到效果才會認可&#xff0c;而教育的效果往往需要經過長期的學習才能看到。 我覺得&…

AI大模型探索之路-訓練篇21:Llama2微調實戰-LoRA技術微調步驟詳解

系列篇章&#x1f4a5; AI大模型探索之路-訓練篇1&#xff1a;大語言模型微調基礎認知 AI大模型探索之路-訓練篇2&#xff1a;大語言模型預訓練基礎認知 AI大模型探索之路-訓練篇3&#xff1a;大語言模型全景解讀 AI大模型探索之路-訓練篇4&#xff1a;大語言模型訓練數據集概…

華為OD機試 - 執行任務賺積分 - 動態規劃(Java 2024 C卷 100分)

華為OD機試 2024C卷題庫瘋狂收錄中,刷題點這里 專欄導讀 本專欄收錄于《華為OD機試(JAVA)真題(A卷+B卷+C卷)》。 刷的越多,抽中的概率越大,每一題都有詳細的答題思路、詳細的代碼注釋、樣例測試,發現新題目,隨時更新,全天CSDN在線答疑。 一、題目描述 現有 N 個任…

Gradle基礎學習(六) 認識任務Task

理解Gradle中的任務 Gradle的構建過程基于任務&#xff08;Task&#xff09;的概念&#xff0c;而每個任務都可以包含一個或多個動作&#xff08;Action&#xff09;。 任務是構建中執行的一些獨立的工作單元&#xff0c;例如編譯類、創建JAR、生成Javadoc或將存檔發布到倉庫…

4.5網安學習第四階段第五周回顧(個人學習記錄使用)

本周重點 ①部署域環境&#xff08;Win2008&#xff09; ②域組策略 ③域內信息收集 ④(重點)哈希傳遞攻擊PTH ⑤MS14-068 提權漏洞 ⑥黃金票據偽造 ⑦白銀票據偽造 ⑧ZeroLogon (CVE-2020-1472) 漏洞復現 本周主要內容 ①部署域環境&#xff08;Win2008&#xff09;…

【算法】滑動窗口——串聯所有單詞的子串

今天來以“滑動窗口”的思想來詳解一道比較困難的題目——串聯所有單詞的子串&#xff0c;有需要借鑒即可。 目錄 1.題目2.下面是示例代碼3.總結 1.題目 題目鏈接&#xff1a;LINK 這道題如果把每個字符串看成一個字母&#xff0c;就是另外一道中等難度的題目&#xff0c;即&…

對象,字符串的解構賦值

大家想了解更多&#xff0c;可以去看阮一峰的ECMAScript6(ES6)標準入門課程 對象 簡介 解構不僅可以用于數組&#xff0c;還可以用于對象。 let { foo, bar } { foo: aaa, bar: bbb }; foo // "aaa" bar // "bbb" 對象的解構與數組有一個重要的不同。…

[CAM_REQ_MGR_EVENT_MAX]高通6225平臺相機老化異常重啟

報錯log 相機老化出現20/7萬比例的老化異常重啟&#xff0c;具體報錯log入下 <4>[ 167.506585] [1970:01:02 18:52:26](0) [0:swapper/0]cam_v4l2_event_queue_notify_error: 251 callbacks suppressed 7 3339<6>[ 167.506602] [1970:01:02 18:52:26](0) [0:swap…

面試試題一

封裝&#xff08;Encapsulation&#xff09; 面試問題&#xff1a; 封裝在面向對象編程中扮演什么角色&#xff1f;如何在Java中實現封裝&#xff1f;有哪些最佳實踐可以幫助提高類的封裝性&#xff1f; 詳細答案&#xff1a; 封裝的角色&#xff1a; 封裝是面向對象編程的核…

CMake 的繼承關系

1. CMake如何確定繼承關系 在 CMake 中&#xff0c;父子關系是通過文件系統中的目錄結構來定義的。當你在一個目錄中創建一個 CMakeLists.txt 文件時&#xff0c;該目錄就被視為一個 CMake 項目的目錄&#xff0c;而該文件中的內容將被用于配置和構建該目錄中的項目。 當你在父…

不同路徑| 和 不同路徑||

不同路徑| 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&#xf…

Tomcat啟動閃退問題解決辦法

本文將通過一系列診斷步驟幫助您找出原因&#xff0c;并提供相應的解決辦法。 診斷步驟 查看日志文件 Tomcat的日志文件是解決啟動問題的第一線工具。查看logs目錄下的catalina.out和其他日志文件&#xff0c;這些文件經常記錄了錯誤信息和系統崩潰的線索。 cat /path/to/to…

C++編程與朱元墇的關系

學編程和英語沒關系&#xff0c;我說這句話&#xff0c;沒人會相信&#xff0c;也不會有人說我什么嘩眾取寵。 我說學編程和朱元墇有關系&#xff0c;一定有人說我放P&#xff0c;其實這個P也和朱元墇有關系&#xff0c; 和朱元墇有什么P關系啊。 真有這P事啊&#xff0c; 朱元…