成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

kgbook / 2732人閱讀

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

讓一切變得更簡單抽象化

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

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

我們將兩者步驟合起來看看

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

咖啡因抽象類

package 改進(jìn)之后;

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

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

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

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

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

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

咖啡類

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("加糖加牛奶");
    }

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

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

茶類

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;
    }

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

測試類

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)一個最簡單的鉤子方法,根據(jù)y/n的輸入得出用戶是否要加入調(diào)料。

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67639.html

相關(guān)文章

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

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

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

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

    tuantuan 評論0 收藏0
  • 筆記 - 收藏集 - 掘金

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

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

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

    WelliJhon 評論0 收藏0

發(fā)表評論

0條評論

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