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

資訊專(zhuān)欄INFORMATION COLUMN

開(kāi)發(fā)之路(設(shè)計(jì)模式九:模板方法模式)

kgbook / 2709人閱讀

摘要:讓一切變得更簡(jiǎn)單抽象化深入封裝算法塊,這便是設(shè)計(jì)模式當(dāng)中的一種模式模板方法模式。定義模板方法模式在一個(gè)方法中定義一個(gè)算法的框架,而將一些步驟延遲到子類(lèi)中。

讓一切變得更簡(jiǎn)單抽象化

深入封裝算法塊,這便是設(shè)計(jì)模式當(dāng)中的一種模式:模板方法模式。
我們先來(lái)看看下面兩個(gè)茶和咖啡配方

也許我們可以很快用Java代碼實(shí)現(xiàn)出來(lái),但我覺(jué)得做之前先分析分析,咖啡和茶的沖泡方式中第(1)步驟是完全一樣的,我認(rèn)為這樣肯定會(huì)出現(xiàn)重復(fù)代碼,寫(xiě)代碼盡量不寫(xiě)重復(fù)代碼,而第(2)(3)(4)步驟大體相似,

我們將兩者步驟合起來(lái)看看

實(shí)現(xiàn)代碼如下

咖啡因抽象類(lèi)

package 改進(jìn)之后;

/**
 * 咖啡因飲料(抽象類(lèi)) 帶鉤子方法 模板方法
 * 
 * @author Joy
 * 
 */
public abstract class CaffeineBeverageWithHook {
    // 制作流程
    public void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        /*
         * 加上一個(gè)條件,具體有customerWantsCondiments()方法決定,當(dāng)用戶(hù)“想要”調(diào)料時(shí),才調(diào)用addCondiments()方法
         */
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    /**
     * 因?yàn)榭Х群筒瓒加羞@兩個(gè)方法,但只是具體實(shí)現(xiàn)不同 所以這兩個(gè)方法必須聲明為抽象,具體實(shí)現(xiàn)交由子類(lèi)
     */
    // 沖泡的方法抽取出來(lái)
    public abstract void brew();

    // 加調(diào)料方法抽取出來(lái)
    public abstract void addCondiments();

    public void boilWater() {
        System.out.println("煮沸水");
    }

    public void pourInCup() {
        System.out.println("將飲料倒入杯子中");
    }

    /**
     * 定義一個(gè)方法(通常為空),這個(gè)方法只會(huì)返回true 這就是一個(gè)鉤子方法 子類(lèi)需根據(jù)需求是否覆蓋這個(gè)方法
     * 
     * @return
     */
    // 添加一個(gè)新(“鉤子”)方法,判斷顧客是否需要添加調(diào)料
    public boolean customerWantsCondiments() {
        return true;
    }
}

咖啡類(lèi)

package 改進(jìn)之后;

import java.util.Scanner;

public class CoffeeWithHook extends CaffeineBeverageWithHook {

    @Override
    public void brew() {
        System.out.println("把沸水沖泡咖啡");
    }

    @Override
    public void addCondiments() {
        System.out.println("加糖加牛奶");
    }

    // 對(duì)此作出判斷
    public boolean customerWantsCondiments() {
        String answer = getUserInput();
        if (answer.equals("y")) {
            return true;
        }
        System.out.println("咖啡不加調(diào)料");
        return false;
    }

    // 詢(xún)問(wèn)顧客是否需要加糖加奶
    private String getUserInput() {
        String answer = null;
        Scanner input = new Scanner(System.in);
        System.out.println("請(qǐng)問(wèn)你是否需要在咖啡里加糖加奶呢?(y/n)");
        answer = input.next();
        if (answer.equals("y")) {
            return answer;
        } else if (answer.equals("n")) {
            return answer;
        } else {
            return "error";
        }
    }
}

茶類(lèi)

package 改進(jìn)之后;

import java.util.Scanner;

public class TeaWithHook extends CaffeineBeverageWithHook {

    @Override
    public void brew() {
        System.out.println("把沸水浸泡茶葉");
    }

    @Override
    public void addCondiments() {
        System.out.println("加檸檬");
    }

    @Override
    public boolean customerWantsCondiments() {
        String answer = getUserInput();
        if (answer.equals("y")) {
            return true;
        }
        System.out.println("茶不加調(diào)料");
        return false;
    }

    // 詢(xún)問(wèn)顧客是否需要加糖加奶
    private String getUserInput() {
        String answer = null;
        Scanner input = new Scanner(System.in);
        System.out.println("請(qǐng)問(wèn)你是否需要在茶里加檸檬呢?(y/n)");
        answer = input.next();
        if (answer.equals("y")) {
            return answer;
        } else if (answer.equals("n")) {
            return answer;
        } else {
            return "error";
        }
    }
}

測(cè)試類(lèi)

package 改進(jìn)之后;

public class TestMain {
    public static void main(String[] args) {
        CoffeeWithHook coffeeHook = new CoffeeWithHook();
        TeaWithHook teaHook = new TeaWithHook();
        System.out.println("========制作咖啡");
        coffeeHook.prepareRecipe();

        System.out.println("
========制作茶");
        teaHook.prepareRecipe();
    }
}

效果圖

而所謂“鉤子”方法其實(shí)是根據(jù)不同情況而做出不同響應(yīng)結(jié)果的一種判斷方法,這其我就實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的鉤子方法,根據(jù)y/n的輸入得出用戶(hù)是否要加入調(diào)料。

定義模板方法模式:在一個(gè)方法中定義一個(gè)算法的框架,而將一些步驟延遲到子類(lèi)中。模板方法使得子類(lèi)可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法的某些步驟。

注:模板就是一個(gè)方法,這個(gè)方法將算法定義成一組步驟,其中的任何步驟都可以是抽象的,由子類(lèi)去實(shí)現(xiàn)。

感謝你看到這里,模板方法模式到這里就結(jié)束了,本人文筆隨便,若有不足或錯(cuò)誤之處望給予指點(diǎn),90度彎腰~~~很快我會(huì)發(fā)布下一個(gè)設(shè)計(jì)模式的內(nèi)容,生命不息,編程不止!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67639.html

相關(guān)文章

  • JS 設(shè)計(jì)模式 模板模式

    摘要:模版方法由抽象類(lèi)聲明并加以實(shí)現(xiàn)。抽象類(lèi)中的模版方法正是通過(guò)實(shí)現(xiàn)類(lèi)擴(kuò)展的方法來(lái)完成業(yè)務(wù)邏輯。一般來(lái)說(shuō),抽象類(lèi)中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,因此通過(guò)增加實(shí)現(xiàn)類(lèi)一般可以很容易實(shí)現(xiàn)功能的擴(kuò)展,符合開(kāi)閉原則。 模板方法模式 定義一個(gè)操作中算法的框架,而將一些步驟延遲到子類(lèi)中,使得子類(lèi)可以不改變算法的結(jié)構(gòu)即可重定義該算法中的某些特定步驟。 模板方法模式是編程中經(jīng)...

    張遷 評(píng)論0 收藏0
  • Python 進(jìn)階之路 () 再立Flag, 社區(qū)最全的itertools深度解析(上)

    摘要:例如,以下對(duì)兩個(gè)的相應(yīng)元素求和這個(gè)例子很好的解釋了如何構(gòu)建中所謂的迭代器代數(shù)的函數(shù)的含義。為簡(jiǎn)單起見(jiàn),假設(shè)輸入的長(zhǎng)度可被整除。接受兩個(gè)參數(shù)一個(gè)可迭代的正整數(shù)最終會(huì)在中個(gè)元素的所有組合的元組上產(chǎn)生一個(gè)迭代器。 前言 大家好,今天想和大家分享一下我的itertools學(xué)習(xí)體驗(yàn)及心得,itertools是一個(gè)Python的自帶庫(kù),內(nèi)含多種非常實(shí)用的方法,我簡(jiǎn)單學(xué)習(xí)了一下,發(fā)現(xiàn)可以大大提升工作...

    tuantuan 評(píng)論0 收藏0
  • 筆記 - 收藏集 - 掘金

    摘要:目錄如何用提高效率后端掘金經(jīng)常有人說(shuō)我應(yīng)該學(xué)一門(mén)語(yǔ)言,比如之類(lèi),但是卻不知道如何入門(mén)。本文將通過(guò)我是如何開(kāi)發(fā)公司年會(huì)抽獎(jiǎng)系統(tǒng)的后端掘金需求出現(xiàn)年會(huì)將近,而年會(huì)抽獎(jiǎng)環(huán)節(jié)必不可少,但是抽獎(jiǎng)系統(tǒng)卻還沒(méi)有。 云盤(pán)一個(gè)個(gè)倒下怎么辦?無(wú)需編碼,手把手教你搭建至尊私享云盤(pán) - 工具資源 - 掘金微盤(pán)掛了,360倒了,百度云盤(pán)也立了Flag。能讓我們?cè)谠贫藘?chǔ)存分享文件的服務(wù)越來(lái)越少了。 買(mǎi)一堆移動(dòng)硬盤(pán)...

    Alex 評(píng)論0 收藏0
  • Python 進(jìn)階之路 (六) 淺一深 lambda,陳獨(dú)秀你給我坐下!

    摘要:好啦,首先讓我們先搞明白基礎(chǔ)定義,到底是什么表達(dá)了中用于創(chuàng)建匿名函數(shù)的特殊語(yǔ)法。其實(shí)總結(jié)起來(lái),可以理解為一個(gè)小的匿名函數(shù),函數(shù)可以使用任意數(shù)量的參數(shù),但只能有一個(gè)表達(dá)式。 lambda是什么 大家好,今天給大家?guī)?lái)的是有關(guān)于Python里面的lambda表達(dá)式詳細(xì)解析。lambda在Python里面的用處很廣,但說(shuō)實(shí)話,我個(gè)人認(rèn)為有關(guān)于lambda的討論不是如何使用的問(wèn)題,而是該不該用...

    WelliJhon 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<