日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java 设计模式之模板方法模式

發(fā)布時間:2024/9/30 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 设计模式之模板方法模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、了解模板方法模式

1.1 什么是模板方法模式

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

模板就是一個方法,更具體的說,這個方法將算法定義為一組步驟,其中的任何步驟都可以是抽象的,由子類負(fù)責(zé)實現(xiàn)。這可以確保算法的結(jié)構(gòu)保持不變,同時由子類提供部分實現(xiàn)。

1.2 模板方法模式組成結(jié)構(gòu)

  • 抽象類(AbstractClass):包含模板方法,定義了算法的骨架。專注于算法本身。
  • 具體類(ConcreteClass):實現(xiàn)抽象類中的抽象方法,完成算法的實現(xiàn)。

1.3 模板方法 UML 圖解

1.4 模板方法的適用場景

  • 在某些類的算法中,用了相同的方法,造成代碼的重復(fù)。
  • 控制子類擴(kuò)展,子類必須遵守算法規(guī)則。

二、模板方法模式具體應(yīng)用

2.1 問題描述

茶與咖啡:有的人喜歡喝茶,而有的人 喜歡喝咖啡。茶與咖啡 之間有什么共同的成分嗎?答案是咖啡因 (怎么樣,沒想到吧)。不止是這樣,茶與咖啡的沖泡方式也十分類似。如下

茶沖泡法:

  • 把水煮沸
  • 用沸水沖泡咖啡
  • 把咖啡倒進(jìn)杯子
  • 加糖和牛奶
  • 咖啡沖泡法:

  • 把水煮沸
  • 用沸水浸泡茶葉
  • 把茶倒進(jìn)杯子
  • 加檸檬
  • 現(xiàn)在我們來設(shè)計代碼,完成茶與咖啡的沖泡。

    2.2 簡單設(shè)計實現(xiàn)

    因為代碼比較簡單,所以這里只提供代碼實現(xiàn)的設(shè)計圖。從上面的設(shè)計圖中,我們應(yīng)該能發(fā)現(xiàn)一個問題:存在著一些重復(fù)的代碼 (boilWater() 與 pourInCup())。所以我們要重新考慮一下設(shè)計,來避免這個問題。

    PS:有一個重要的設(shè)計原則:找出應(yīng)用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起。

    于是我們可能想到使用繼承,把不變的代碼方法超類中,把變化的代碼放在子類中去實現(xiàn)。

    2.3 使用繼承

    這種通過繼承的設(shè)計感覺還不錯,可以很好的解決問題。但是我們仔細(xì)想想,沖泡茶與咖啡是不是還存在一些共同點呢?其實 brewCoffeeGrinds() 與 steepTeaBag() 的動作很類似,因此我們可以使用 brew() 來統(tǒng)一這兩個方法;addSugarAndMilk() 與 addLemon() 也很類似,我們用 addCondiments() 來統(tǒng)一。

    2.4 模板方法模式登場

    (1) 模板方法 UML 設(shè)計 (可參考模板方法 UML 圖解)

    (2) 模板方法代碼實現(xiàn)

    抽象 CaffineBeverage 類

    package com.jas.templatemethod;public abstract class CaffineBeverage {/*** 模板方法,用作一個算法的模板,用于制作茶與咖啡* 并定義為 final 的,防止子類覆蓋*/final void prepareRecipe(){boilWater();brew();pourInCup();addCondiments();}void boilWater(){System.out.println("煮沸水!");}abstract void brew();void pourInCup(){System.out.println("倒進(jìn)杯子里!");}abstract void addCondiments(); }

    具體 Tea 類

    package com.jas.templatemethod;public class Tea extends CaffineBeverage {@Overridevoid brew() {System.out.println("用沸水浸泡茶葉!");}@Overridevoid addCondiments() {System.out.println("加入檸檬!");} }

    具體 Coffee 類

    package com.jas.templatemethod;public class Coffee extends CaffineBeverage {@Overridevoid brew() {System.out.println("用沸水浸泡咖啡!");}@Overridevoid addCondiments() {System.out.println("加入糖與牛奶!");} }

    測試類

    package com.jas.templatemethod;public class Test {public static void main(String[] args) {CaffineBeverage coffee = new Coffee();CaffineBeverage tea = new Tea();coffee.prepareRecipe();System.out.println();tea.prepareRecipe();} }/*** 輸出* 煮沸水!* 用沸水浸泡咖啡!* 倒進(jìn)杯子里!* 加入糖與牛奶!** 煮沸水!* 用沸水浸泡茶葉!* 倒進(jìn)杯子里!* 加入檸檬!*/

    (3) 問題總結(jié)

    CaffineBeverage 類主導(dǎo)一切,它擁有算法,并保護(hù)這個算法 (模板方法定義為 final 的)。對于子類來說,因為 CaffineBeverage 類的存在,代碼能夠最大程度的復(fù)用。并且算法存在于模板方法中,更易于修改,并且擴(kuò)展性更強(qiáng)。CaffineBeverage 類本身專注與算法本身,由子類提供完整實現(xiàn)。

    2.5 對模板方法進(jìn)行掛鉤

    (1) 什么是鉤子

    鉤子 (Hook) 是一種被聲明抽象類中的方法,但是只有空的或默認(rèn)的實現(xiàn)。
    鉤子的存在,可以讓子類有能力對算法的不同點進(jìn)行掛鉤。到底要不要掛鉤,由子類自行決定。

    (2) 將鉤子應(yīng)用到代碼中去

    改造 CaffineBeverage

    package com.jas.templatemethod;public abstract class CaffineBeverageWithHook {final void prepareRecipe(){boilWater();brew();pourInCup();/** 這里加上鉤子的判斷,只有鉤子返回值為 true 時,表示顧客想要加調(diào)料,才添加調(diào)料*/if(customerWantsCondiments()){addCondiments();}else {System.out.println("不添加任何調(diào)料");}}void boilWater(){System.out.println("煮沸水!");}abstract void brew();void pourInCup(){System.out.println("倒進(jìn)杯子里!");}abstract void addCondiments();/*** 這是一個鉤子,子類可以自行選擇覆蓋,但是也可以不這么做。* @return*/boolean customerWantsCondiments(){return true;} }

    改造 Coffee

    package com.jas.templatemethod;import java.util.Scanner;public class CoffeeWithHook extends CaffineBeverageWithHook {@Overridevoid brew() {System.out.println("用沸水浸泡咖啡!");}@Overridevoid addCondiments() {System.out.println("加入糖與牛奶!");}@Overrideboolean customerWantsCondiments() {/** 只有當(dāng)用戶輸入的是 'y' 時,返回 true,才添加調(diào)料 */if("y".equals(getUserInput())){return true;}else {return false;}}/*** 獲得用戶在控制臺輸入的數(shù)據(jù)* @return*/private String getUserInput(){String answer = null;System.out.println("你是否想要添加調(diào)料,請輸入 (y/n)");Scanner read = new Scanner(System.in);answer = read.nextLine();return answer;} }

    測試

    package com.jas.templatemethod;public class Test {public static void main(String[] args) {CaffineBeverageWithHook coffeeWithHook = new CoffeeWithHook();coffeeWithHook.prepareRecipe();}/*** 輸出* 煮沸水!* 用沸水浸泡咖啡!* 倒進(jìn)杯子里!* 你是否想要添加調(diào)料,請輸入 (y/n)* y* 加入糖與牛奶!*/ }

    (3) 鉤子總結(jié)

    在實際工作中,如果算法的這個部分是可選的,那么你可以選擇使用鉤子。
    鉤子可以讓子類實現(xiàn)算法中可選的部分,或者在鉤子對子類的實現(xiàn)并不重要時,子類可以對此鉤子置之不理。
    鉤子可以使子類能夠有機(jī)會對模板方法中即將發(fā)生的步驟做出反應(yīng)。

    三、 模板方法模式總結(jié)

    3.1 模板方法優(yōu)缺點總結(jié)

    優(yōu)點

    • 封裝不變部分,擴(kuò)展可變部分。
    • 提取公共代碼,便于維護(hù)。
    • 行為由父類控制,子類實現(xiàn)。

    缺點

    每一個不同的實現(xiàn)都需要一個子類來實現(xiàn),導(dǎo)致類的個數(shù)增加,使得系統(tǒng)更加龐大。

    3.2 模板方法模式知識點總結(jié)

    • 模板方法”定義了算法的實現(xiàn)步驟,并把一些步驟的實現(xiàn)推遲到子類中。
    • 模板方法模式為我們提供了一種代碼復(fù)用的技巧。
    • 模板方法的抽象類可以定義具體方法、抽象方法和鉤子。抽象方法由其子類實現(xiàn)。
    • 鉤子是一種方法,它在抽象類中不做事,或者只做一些默認(rèn)的事,子類可以選擇要不要覆蓋它。
    • 為了防止子類覆蓋模板方法,可以將模板方法定義為 final 的。
    • 可以把工廠方法理解為模板方法的一種特殊版本。

    PS:點擊了解更多設(shè)計模式 http://blog.csdn.net/codejas/article/details/79236013

    參考文獻(xiàn)

    《Head First 設(shè)計模式》

    總結(jié)

    以上是生活随笔為你收集整理的Java 设计模式之模板方法模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩精品视频免费看 | 中文字幕在线三区 | 99热这里只有精品2 91免费版黄 | 成人影音在线 | 国产久草av | 猛1被调教成公厕尿便失禁网站 | 人人妻人人做人人爽 | 国产xxxxwwww| 日韩欧美二区三区 | 麻豆视频在线免费观看 | 91免费播放 | 老司机av福利| 欧美极品在线 | 天天射夜夜爽 | 综合第一页 | 捆绑无遮挡打光屁股调教女仆 | 日韩色中色 | 日本一道在线 | 一区二区三区视频网 | 国产精品久久久久久久久绿色 | 男操女视频网站 | 青青草原综合网 | 一本一道久久a久久精品蜜桃 | 大度亲吻原声视频在线观看 | av青青草 | 日韩精品一区二区电影 | 精品一区在线视频 | 欧美日韩免费观看一区=区三区 | 性色AV无码久久一区二区三 | 国产又猛又粗 | 六月丁香色婷婷 | 丁香在线视频 | 福利视频一区二区 | 中文字幕少妇在线三级hd | 国产又色又爽又黄又免费 | 7777av| 性感美女福利视频 | 日韩亚洲视频在线观看 | 99精品国自产在线 | 日韩精品免费电影 | 香蕉狠狠爱视频 | 在线观看日韩中文字幕 | 日韩一页 | 草青青视频| 毛片啪啪啪 | a天堂视频在线观看 | 日本老年老熟无码 | 秋霞毛片 | 性中国xxx极品hd | 久久国产精品无码一级毛片 | www欧美com| 谁有毛片网址 | 国产黄色片免费观看 | 欧美激情综合色综合啪啪五月 | 嫩草影院一区 | 中国少妇无码专区 | 西比尔在线观看完整视频高清 | 欧美成人极品 | 日韩 国产 一区 | 天天操天天干天天爽 | 超碰资源 | 国产在线精品自拍 | 99热国产精品 | 日本精品久久久 | 国产精品8| 精品二三区 | h网址在线观看 | 五月天黄色小说 | 美日韩一区二区三区 | 久久99精品国产91久久来源 | 先锋影音av在线资源 | 亚洲黄色激情 | 久久精品无码Av中文字幕 | 女王脚交玉足榨精调教 | 污夜影院| 欧美午夜理伦三级在线观看 | 91在线观看免费高清完整版在线观看 | 黄色一级片av | 另类捆绑调教少妇 | 国产日韩精品一区二区三区 | 欧美色图13p | 影音先锋天堂网 | 在线免费观看黄网站 | 涩涩久久 | 国产宾馆自拍 | 久久人人爽爽人人爽人人片av | 久久伊人av | 免费日韩一区二区 | 骚虎视频最新网址 | а√天堂中文在线资源8 | 国产午夜电影 | 象人高潮调教丨vk | 美女色网站 | 68日本xxxxxⅹxxx59 | 韩国jizz | 鲁丝一区二区三区 | 国产在线一卡二卡 | 天天干夜夜怕 | xxxxx毛片|