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