摘要:前言模板方法是本人認為種設計模式最簡單的。使用場景子類具有相同的方法,并且邏輯基本相同代碼重構時,模板方法會經常使用到,然后通過鉤子函數見模板方法擴展約束其行為。
前言
模板方法是本人認為23種設計模式最簡單的。其根本就是巧妙運用java的繼承機制,下面為大家以一一講來.
什么是模板方法模式定義一個操作中的算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個算法的結構即可重定義該算法的某些特定邏輯。UML類圖
父類中具有兩種方法,一種是基本方法,供子類復寫,另一種是模板方法,用來調度基本方法,相當于定義一個框架。子類通過復寫基本方法,調用父類的模板方法就是模板方法的體現。
使用場景子類具有相同的方法,并且邏輯基本相同
代碼重構時,模板方法會經常使用到,然后通過鉤子函數(見模板方法擴展)約束其行為。
代碼分析public abstract class AbstractDoctor { //了解病情 protected abstract void knowAboutSymptoms(); //分析病情 protected abstract void analysisIllness(); //治療患者 protected abstract void curePatient(); public void work() { knowAboutSymptoms(); analysisIllness(); curePatient(); } }
public class ChineseDoctor extends AbstractDoctor { @Override protected void knowAboutSymptoms() { System.out.println("中醫通過望聞問切了解病人病情"); } @Override protected void analysisIllness() { System.out.println("得知病情后,通過自己豐富的經驗分析病情,制定治療方案"); } @Override protected void curePatient() { System.out.println("根據治療方案給你抓中藥"); } }
public class WestDoctor extends AbstractDoctor { @Override protected void knowAboutSymptoms() { System.out.println("簡單詢問,就讓你去拍個片"); } @Override protected void analysisIllness() { System.out.println("根據x光片,分析病人病情,制定治療方案"); } @Override protected void curePatient() { System.out.println("打針,輸液,藥片各來一打,包治百病"); } }
public class Client { public static void main(String[] args) { AbstractDoctor chineseDoctotr = new ChineseDoctor(); chineseDoctotr.work(); System.out.println("===============華麗的分隔符========================"); AbstractDoctor westDoctor = new WestDoctor(); westDoctor.work(); } } 測試結果: 中醫通過望聞問切了解病人病情 得知病情后,通過自己豐富的經驗分析病情,制定治療方案 根據治療方案給你抓中藥 ===============華麗的分隔符======================== 簡單詢問,就讓你去拍個片 根據x光片,分析病人病情,制定治療方案 打針,輸液,藥片各來一打,包治百病
不管你是中醫還是西醫,你的工作就是治病救人,工作流程也基本相同,都是了解病情,分析病情,治療病人這個流程。在父類中定義一個算法來控制流程,具體實現交給具體子類,再由子類調用父類的work(模板方法)進行運作。
模板方法模式的擴展要知道,直到今天醫療資源也是很寶貴的資源。有的病人裝病,有的人送到醫院已經完全死去沒有生命象征,對于這些病人我們就沒有必要再去治療了。那如何去控制呢?我們可以通過鉤子函數約束其行為。
public abstract class AbstractDoctor { protected boolean checkIsCure =true; //了解病情 protected abstract void knowAboutSymptoms(); //分析病情 protected abstract void analysisIllness(); //治療患者 protected abstract void curePatient(); //檢查病人是否需要治療,默認需要 //鉤子函數 protected boolean checkIsCure(){ return true; } public void work() { knowAboutSymptoms(); analysisIllness(); if (checkIsCure()){ curePatient(); } } }
public class ChineseDoctor extends AbstractDoctor { @Override public void knowAboutSymptoms() { System.out.println("中醫通過望聞問切了解病人病情"); } @Override public void analysisIllness() { System.out.println("得知病情后,通過自己豐富的經驗分析病情,制定治療方案"); } @Override public void curePatient() { System.out.println("根據治療方案給你抓中藥"); } @Override protected boolean checkIsCure(){ return super.checkIsCure; } protected void setCheckIsCure(boolean isCure){ super.checkIsCure=isCure; } }
public class Client { public static void main(String[] args) { ChineseDoctor chineseDoctotr = new ChineseDoctor(); chineseDoctotr.setCheckIsCure(false); chineseDoctotr.work(); System.out.println("===============華麗的分隔符========================"); AbstractDoctor westDoctor = new WestDoctor(); westDoctor.work(); } } 測試結果: 中醫通過望聞問切了解病人病情 得知病情后,通過自己豐富的經驗分析病情,制定治療方案 ===============華麗的分隔符======================== 簡單詢問,就讓你去拍個片 根據x光片,分析病人病情,制定治療方案 打針,輸液,藥片各來一打,包治百病
通過鉤子函數給中醫賦予了若病人治療無聊,則可以選擇不治療。其實鉤子函數就是子類方法決定模板方法的執行結果,這樣就靈活了許多。
總結模板方法模式就是在模板方法中按照一定的規則和順序調用基本方法,具體到前面的例子就是先調用knowAboutSymptoms(),再調用analysisIllness(),然后調用checkIsCure()選擇是否執行curePatient()。
按照我們的設計習慣抽象類負責定義,實現類負責實現具體邏輯,而模板方法確實抽象類定義了部分抽象方法,由子類實現,子類執行的結果影響到了父類的結果,所以其最大的缺點就是增大了閱讀代碼的難度。其最大的優點就是封裝了不變部分,擴展了可變部分,提取公共代碼,利于維護。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70662.html
摘要:模板方法模式定義了一個算法的步驟,并允許子類別為一個或多個步驟提供其實踐方式。在軟件工程中,它是一種軟件設計模式,和模板沒有關連。模板方法充分運用了多態與繼承。去建設銀行支付去招商銀行支付實現模板方法的細節,我們來看使用邏輯。 Photo by Tomá? Malík on Unsplash 什么是模板方法模式?摘錄 wiki 的介紹。 模板方法模式定義了一個算法的步驟,并允許子類別為...
模板方法模式 定義: 在繼承的基礎上, 在父類中定義好執行的算法。泡茶和泡咖啡來對比下泡茶和泡咖啡過程中的異同 步驟 泡茶 泡咖啡1 燒開水 燒開水2 浸泡茶葉 沖泡咖啡3 倒入杯子 倒入杯子4 加檸檬 加糖可以清晰地看出僅僅在步驟 2 和 4 上有細微的差別, 下面著手實現: const Drinks = function(){} ...
摘要:讓一切變得更簡單抽象化深入封裝算法塊,這便是設計模式當中的一種模式模板方法模式。定義模板方法模式在一個方法中定義一個算法的框架,而將一些步驟延遲到子類中。 讓一切變得更簡單抽象化 深入封裝算法塊,這便是設計模式當中的一種模式:模板方法模式。 我們先來看看下面兩個茶和咖啡配方showImg(https://segmentfault.com/img/bVV4kS?w=1248&h=...
摘要:方法上的注解對請求路徑進行了進一步細化它僅接受方法的請求。這種情況下,一個路徑為方法為的請求將會被這個方法所處理。類級別的注解并不是必須的。如果僅想接收某種請求方法,請在注解中指定之以縮小范圍。 前言 以下部分內容來自官方文檔文檔描述 @Controller 使用@Controller注解定義一個控制器,@Controller注解表明了一個類是作為控制器的角色而存在的。Spring不要...
摘要:旨在記錄自己的學習過程,方便日后遇到問題是及時查閱復習,另一方面也希望能幫助像筆者一樣從來沒使用過的人快速熟悉。 這篇文章主要記錄的是本人學習使用IntelliJ IDEA的筆記,可能不是特別的詳細。旨在記錄自己的學習過程,方便日后遇到問題是及時查閱復習,另一方面也希望能幫助像筆者一樣從來沒使用過IDEA的人快速熟悉IDEA。文章錯誤之處還請各位大佬批評指正。(文末有本人的微信公眾號,...
閱讀 2109·2021-11-23 09:51
閱讀 2847·2021-11-22 15:35
閱讀 2947·2019-08-30 15:53
閱讀 1046·2019-08-30 14:04
閱讀 3284·2019-08-29 12:39
閱讀 1817·2019-08-28 17:57
閱讀 1104·2019-08-26 13:39
閱讀 560·2019-08-26 13:34