日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

14-模板方法模式Quarkus实现

發布時間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 14-模板方法模式Quarkus实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要:本文用一個實例場景描述Gof 23設計模式中的模板方法模式,并用Quarkus框架代碼給予實現,同時也給出實現代碼的UML模型。
關鍵字:Gof 23 設計模式 模板模式 Quarkus

1 基礎知識
1.1 標準定義
模板方法(Template Method)模式標準定義:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
1.2 分析和說明
模板方法(Template Method)模式屬于行為型設計模式。模板方法模式準備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然后聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。也即是先制定一個頂級邏輯框架,而將邏輯的細節留給具體的子類去實現。
模板方法(Template Method)模式結構如圖1所示,其角色包括抽象模版(Abstract Class)角色和具體模版(Concrete Class)角色。
圖1 模板方法模式結構
抽象模版(Abstract Class)角色有如下的責任:定義了一個或多個抽象操作,以便讓子類實現。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟。定義并實現了一個模板方法。這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯也有可能調用一些具體方法。
具體模版(Concrete Class)角色有如下的責任:實現父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。
每一個抽象模版角色都可以有任意多個具體模版角色與之對應,而每一個具體模版角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現,從而使得頂級邏輯的實現各不相同。
2 應用場景舉例
比如公司研發項目的過程是可行性研究、需求分析、總體設計、詳細設計、系統編碼、系統測試、系統部署、系統維護等標準過程。這些可以形成一個接口,但是為了簡化工作,可以形成一個抽象的模板類。把這些步驟全部都實現,如果不能實現,那就使用抽象方法。現在有某給具體項目,其中的總體設計和詳細設計與模板不同,這就可以采用模板方法模式。用例見圖2所示。
圖2 模板方法模式用例圖
在這里可以把ProjectProcessTemplate抽象類理解為抽象模版(Abstract Class)角色。ProjectA類和 ProjectB類是具體模版(Concrete Class)角色。其結構類圖如圖3所示。ProjectA類和 ProjectB類都繼承ProjectProcessTemplate抽象類并實現ProjectProcess接口。
圖3 模板方法模式類圖
模板方法模式實現順序圖見圖4,實現順序描述:① 基于ProjectA創建一個project1對象;② 調用project1對象的doActualWork方法,形成project1對象的項目過程;③ 調用project1對象的showProcess方法顯示project1對象的項目過程。
圖4 模板方法模式實現順序圖
ProjectProcessTemplate抽象類定義一個操作中的算法的骨架,具體實現步驟延遲到子類ProjectA類和 ProjectB類中。

3.Quarkus的實現程序代碼
Quarkus程序實現主要包括ProjectProcess接口文件,ProjectProcessTemplate抽象類文件,ProjectA類文件和ProjectB類文件等4個文件。其關系如圖3所示。下面分別列出這4個文件的程序代碼,最后列出測試代碼并顯示輸出結果。
ProjectProcess接口程序代碼清單01所示。
程序代碼清單01

public interface ProjectProcess { //可行性分析過程public void feasibilityProcess(String content);//技術交流過程public void technicalDiscussionProcess(String content);//投標過程public void bidProcess(String content);//需求調研和分析過程public void requirementProcess(String content);//設計過程public void designProcess(String content);//編碼過程public void programProcess(String content);//測試過程public void testProcess(String content);//部署和實施過程public void deploymentProcess(String content);//維護過程public void maintenanceProcess(String content);public void doActualWork(); public void showProcess(); }

ProjectProcessTemplate抽象類程序代碼清單02所示。
程序代碼清單02

public abstract class ProjectProcessTemplate { public Map<String,String> processMap = new HashMap<String,String>();//可行性分析過程public void feasibilityProcess(String content){processMap.put("feasibilityProcess", content);}//技術交流過程public void technicalDiscussionProcess(String content){processMap.put("technicalDiscussionProcess", content);}//投標過程public void bidProcess(String content){processMap.put("bidProcess", content);}//需求調研和分析過程public void requirementProcess(String content){processMap.put("requirementProcess", content);}//設計過程public void designProcess(String content){processMap.put("designProcess", content);}//編碼過程public void programProcess(String content){processMap.put("programProcess", content);}//測試過程public void testProcess(String content){processMap.put("testProcess", content);}//部署和實施過程public void deploymentProcess(String content){processMap.put("deploymentProcess", content);}//維護過程public void maintenanceProcess(String content){processMap.put("maintenanceProcess", content);}public void showProcess(){String key = null;String value = null; Iterator<String> it = processMap.keySet().iterator();while (it.hasNext()){key = it.next();value = processMap.get(key);System.out.println("過程: " + key + "; 內容: " + value );}} }

ProjectA類繼承ProjectProcessTemplate抽象類并實現ProjectProcess接口,其程序代碼清單03所示。
程序代碼清單03

@ApplicationScoped public class ProjectA extends ProjectProcessTemplate implements ProjectProcess{public void doActualWork(){ feasibilityProcess("定制可行性研究"); technicalDiscussionProcess("定制技術交流"); bidProcess("定制投標"); requirementProcess("定制需求");designProcess("定制設計");programProcess("定制編碼"); testProcess("定制測試"); deploymentProcess("定制部署"); maintenanceProcess("定制維護"); } }

ProjectB類繼承ProjectProcessTemplate抽象類并實現ProjectProcess接口,其程序代碼清單04所示。
程序代碼清單04

@ApplicationScoped public class ProjectB extends ProjectProcessTemplate implements ProjectProcess{public void doActualWork(){ requirementProcess("定制需求");designProcess("定制設計");programProcess("定制編碼"); testProcess("定制測試"); deploymentProcess("定制部署"); maintenanceProcess("定制維護"); } }

模板方法模式測試程序的代碼清單05如下:
程序代碼清單05

public class TemplateClient implements QuarkusApplication{@ConfigProperty(name = "gof23.behavioralpattern.template.title", defaultValue = "gof23")String title;@Inject ProjectA project1; @Inject ProjectB project2;@Overridepublic int run(String... args) { System.out.println("——————" + title + "演示輸出————————"); System.out.println("——————projectA的過程——————"); project1.doActualWork();project1.showProcess();System.out.println("——————projectB的過程——————"); project2.doActualWork();project2.showProcess(); return 0;}public static void main(String... args) {Quarkus.run(TemplateClient.class, args);} }

模板方法模式測試類輸出結果如下所示:

——————projectA的過程——————
過程: deploymentProcess; 內容: 定制部署
過程: maintenanceProcess; 內容: 定制維護
過程: requirementProcess; 內容: 定制需求
過程:designProcess; 內容: 定制設計
過程: programProcess; 內容: 定制編碼
過程: bidProcess;> 內容: 定制投標
過程: testProcess; 內容: 定制測試
過程: feasibilityProcess; 內容: 定制可行性研究
過程: technicalDiscussionProcess; 內容: 定制技術交流
——————projectB的過程——————
過程:> deploymentProcess; 內容: 定制部署
過程: maintenanceProcess; 內容: 定制維護
過程:> requirementProcess; 內容: 定制需求
過程: designProcess; 內容: 定制設計
過程:> programProcess; 內容: 定制編碼
過程: testProcess; 內容: 定制測試

4. 相關Quarkus程序源碼下載
可以直接從github上獲取代碼,讀者可以從github上clone預先準備好的示例代碼。

git clone https://github.com/rengang66/quarkus-sample-gof23.git

這是一個Maven項目,然后Maven導入工程。該程序位于“src\main\java\com\iiit\quarkus\sample\gof23\behavioralpattern\template”目錄中。
同時也可以從gitee上clone預先準備好的示例代碼,命令如下:

git clone https://gitee.com/rengang66/quarkus-sample-gof23.git

參考文獻

[1] E.Gamma, R.Helm, R.Johnson, and Vlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley, 1995
[2] E.Gamma, R.Helm, R.Johnson, and Vlissides.著,李英軍等譯,設計模式:可復用面向對象軟件的基礎,北京:機械工業出版社.2000.9.
[3] 閻宏,Java與模式,北京:電子工業出版社. 2002.10
[4] 王俊峰 戚曉濱. 設計模式和UML. 計算機應用研究,1999.16(5), 27-29,39.
[5] 陳琴 朱正強. UML在設計模式描述中的應用. 計算機工程與設計,2003.24(4), 81-84.
[6] 肖保良 宋東 趙勝. 基于模式的ATS領域框架研究. 計算機測量與控制,2007.15(9), 1144-1147.
[7] 顧穎 徐良賢 賈銀軍. JUnit設計模式分析和應用. 計算機工程,2004.30(B12), 178-179,182.
[8] 戴建國 郭理 曹傳東. JUnit框架剖析. 計算機與數字工程,2008.36(8), 43-45,135.
[9] 吳信永 宋東 劉飛. 基于構件技術的通用ATS框架設計. 計算機測量與控制,2008.16(2), 141-143,155.
[10] 王莉 湯靈愈. 基于設計模式的遺傳算法類庫的框架模型. 科技創新導報,2008.(3), 7-8.
[11] 劉繁艷. 基于JAVA的模板設計模式研究. 電腦知識與技術:學術交流,2008.(7), 60-62.
[12] 任勇軍 王志堅. 模板方法模式及其在Java2D中的應用. 計算機與現代化,2003.(9), 13-15.
[13] Quarkus官網. https://quarkus.io/

總結

以上是生活随笔為你收集整理的14-模板方法模式Quarkus实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。