日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 朝桐光av一区二区三区 | 中文字幕在线视频一区二区三区 | 中文字幕人妻伦伦 | 人人看人人艹 | 高清无打码 | 97在线看| 欧美涩涩视频 | 大奶一区二区 | 欧美aaa视频 | av资源在线免费观看 | 亚洲精品国产av | www午夜 | 欧美日韩a v | 午夜免费片 | 成人h动漫精品一区二区器材 | 国产精品日日做人人爱 | 国产免费黄| 91夜色视频| 日本欧美久久久久免费播放网 | 不卡av网站 | 亚洲精品视频一区二区 | av簧片 | 外国av在线 | 成人不卡视频 | r级无码视频在线观看 | 成人免费视| 伊人久久在线 | 国产一级一片 | 99久久久国产精品无码网爆 | 日本免费一区二区三区 | exo妈妈mv在线播放免费 | 国产精品二区三区 | 奇米四色7777| 麻豆传媒一区二区 | 午夜写真片福利电影网 | 黄色一级免费网站 | 七七色影院 | 精品人妻一区二区三区免费 | 91网站永久免费看nba视频 | 日本性生活一级片 | 色一情| 亚洲乱妇| 韩国理论午夜 | 亚洲涩色| 猛1被调教成公厕尿便失禁网站 | 韩日视频在线 | 亚洲经典在线 | 欧美成人日韩 | 四虎4hu永久免费网站影院 | www.久久艹 | 亚洲激情视频在线观看 | 婷婷综合色 | 91精品国产麻豆国产自产在线 | 人妻熟人中文字幕一区二区 | 国产精品视频免费观看 | 三级黄色短视频 | 久久乐国产精品 | 91精品啪在线观看国产 | 91精品导航 | 毛片av免费| 欧美另类视频在线观看 | 国产综合视频在线观看 | 精品国产亚洲一区二区麻豆 | 亚洲狠狠婷婷综合久久久久图片 | 精品无码人妻少妇久久久久久 | 91在线视频精品 | 日本丰满熟妇hd | 亚洲视频欧美 | 精品一区二区三区免费视频 | 国产精品500部 | 五月天在线观看 | 裸体的日本在线观看 | 瑟瑟视频在线 | 91香蕉国产在线观看 | 国产91av在线播放 | 久久久噜噜噜久久中文字幕色伊伊 | 深夜福利一区二区 | 丰满少妇被猛烈进入 | 欧美激情久久久 | 综合色在线视频 | 日韩av第一页 | 波多野结衣亚洲天堂 | 伊人焦久影院 | 影音先锋每日资源 | 国产特黄 | 欧美性三级 | 国产精品zjzjzj在线观看 | 简单av网 | 日韩欧美视频免费在线观看 | 欧美精品一线 | 亚洲国产成人综合 | 日韩美女性生活 | 福利社区一区二区 | 国产亚洲精品网站 | 欧美日韩福利视频 | 波兰性xxxxx极品hd | 麻豆视频免费观看 | 日韩经典在线 | 精品国产乱码久久久久久久软件 |