国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

設(shè)計模式之模板方法

el09xccxy / 2756人閱讀

摘要:前言模板方法是本人認(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

相關(guān)文章

  • 從源碼學(xué)習(xí)設(shè)計模式模板方法

    摘要:模板方法模式定義了一個算法的步驟,并允許子類別為一個或多個步驟提供其實踐方式。在軟件工程中,它是一種軟件設(shè)計模式,和模板沒有關(guān)連。模板方法充分運用了多態(tài)與繼承。去建設(shè)銀行支付去招商銀行支付實現(xiàn)模板方法的細(xì)節(jié),我們來看使用邏輯。 Photo by Tomá? Malík on Unsplash 什么是模板方法模式?摘錄 wiki 的介紹。 模板方法模式定義了一個算法的步驟,并允許子類別為...

    yankeys 評論0 收藏0
  • javascript 設(shè)計模式 模板方法模式

    模板方法模式 定義: 在繼承的基礎(chǔ)上, 在父類中定義好執(zhí)行的算法。泡茶和泡咖啡來對比下泡茶和泡咖啡過程中的異同 步驟 泡茶 泡咖啡1 燒開水 燒開水2 浸泡茶葉 沖泡咖啡3 倒入杯子 倒入杯子4 加檸檬 加糖可以清晰地看出僅僅在步驟 2 和 4 上有細(xì)微的差別, 下面著手實現(xiàn): const Drinks = function(){} ...

    邱勇 評論0 收藏0
  • 開發(fā)路(設(shè)計模式九:模板方法模式

    摘要:讓一切變得更簡單抽象化深入封裝算法塊,這便是設(shè)計模式當(dāng)中的一種模式模板方法模式。定義模板方法模式在一個方法中定義一個算法的框架,而將一些步驟延遲到子類中。 讓一切變得更簡單抽象化 深入封裝算法塊,這便是設(shè)計模式當(dāng)中的一種模式:模板方法模式。 我們先來看看下面兩個茶和咖啡配方showImg(https://segmentfault.com/img/bVV4kS?w=1248&h=...

    kgbook 評論0 收藏0
  • SpringMVCController(二)

    摘要:方法上的注解對請求路徑進(jìn)行了進(jìn)一步細(xì)化它僅接受方法的請求。這種情況下,一個路徑為方法為的請求將會被這個方法所處理。類級別的注解并不是必須的。如果僅想接收某種請求方法,請在注解中指定之以縮小范圍。 前言 以下部分內(nèi)容來自官方文檔文檔描述 @Controller 使用@Controller注解定義一個控制器,@Controller注解表明了一個類是作為控制器的角色而存在的。Spring不要...

    cooxer 評論0 收藏0
  • 開發(fā)利器IntelliJ IDEA學(xué)習(xí)筆記

    摘要:旨在記錄自己的學(xué)習(xí)過程,方便日后遇到問題是及時查閱復(fù)習(xí),另一方面也希望能幫助像筆者一樣從來沒使用過的人快速熟悉。 這篇文章主要記錄的是本人學(xué)習(xí)使用IntelliJ IDEA的筆記,可能不是特別的詳細(xì)。旨在記錄自己的學(xué)習(xí)過程,方便日后遇到問題是及時查閱復(fù)習(xí),另一方面也希望能幫助像筆者一樣從來沒使用過IDEA的人快速熟悉IDEA。文章錯誤之處還請各位大佬批評指正。(文末有本人的微信公眾號,...

    馬永翠 評論0 收藏0

發(fā)表評論

0條評論

el09xccxy

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<