摘要:時間年月日星期六說明本文部分內(nèi)容均來自慕課網(wǎng)。案例介紹飲料機配置模版把水煮沸泡飲料把飲料倒進杯子加調(diào)味料第二章模版模式實現(xiàn)基本框架代碼編寫編寫類模版模式抽象基類,為所有子類提供一個算法框架。
時間:2017年09月02日星期六
說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com
教學(xué)源碼:https://github.com/zccodere/s...
學(xué)習(xí)源碼:https://github.com/zccodere/s...
內(nèi)容介紹
什么是模版方法模式 如何實現(xiàn)模版方法模式 模版方法模式的特點 模版方法模式在項目中的應(yīng)用
模板方法模式
定義了一個操作算法框架,而將一些步驟延遲到子類中實現(xiàn), 使得子類在不改變一個算法結(jié)構(gòu)的同時就重新定義該算法的某些特定步驟。
案例介紹:飲料機配置模版
1.把水煮沸(boilWater) 2.*泡飲料(brew)* 3.把飲料倒進杯子(pourInCup) 4.*加調(diào)味料(addCondiments)*第二章:模版模式實現(xiàn) 2-1 基本框架
代碼編寫
1.編寫RefreshBeverage類
package com.myimooc.designpattern.c8template; /** * @title 模版模式 * @describe 抽象基類,為所有子類提供一個算法框架。提神飲料 * @author zc * @version 1.0 2017-09-02 */ public abstract class RefreshBeverage { /** * 制備飲料的模版方法 * 封裝了所有子類共同遵循的算法框架 */ public final void prepareBeverageTemplate(){ // 步驟1 將水煮沸 boilWater(); // 步驟2 泡制飲料 brew(); // 步驟3 將飲料倒入杯中 pourInCup(); // 步驟4 加入調(diào)味料 addCondiments(); } /** * 基本方法,將水煮沸 */ private void boilWater() { System.out.println("將水煮沸"); } /** * 基本方法,將飲料倒入杯中 */ private void pourInCup() { System.out.println("將飲料倒入杯中"); } /** * 抽象的基本方法,泡制飲料 */ protected abstract void addCondiments(); /** * 抽象的基本方法,加入調(diào)味料 */ protected abstract void brew(); }2-2 子類實現(xiàn)
代碼編寫
1.編寫Coffee類
package com.myimooc.designpattern.c8template; /** * @title 模版模式 * @describe 具體子類,提供了咖啡之中的具體實現(xiàn) * @author zc * @version 1.0 2017-09-02 */ public class Coffee extends RefreshBeverage { @Override protected void addCondiments() { System.out.println("用沸水沖泡咖啡"); } @Override protected void brew() { System.out.println("加入糖和牛奶"); } }
2.編寫Tea類
package com.myimooc.designpattern.c8template; /** * @title 模版模式 * @describe 具體子類,提供了制備茶的具體實現(xiàn) * @author zc * @version 1.0 2017-09-02 */ public class Tea extends RefreshBeverage { @Override protected void addCondiments() { System.out.println("用80度的熱水浸泡茶葉5分鐘"); } @Override protected void brew() { System.out.println("加入檸檬"); } }
3.編寫RefreshBeverageTest類
package com.myimooc.designpattern.c8template; /** * @title 模版模式 * @describe 測試類 * @author zc * @version 1.0 2017-09-02 */ public class RefreshBeverageTest { public static void main(String[] args) { System.out.println("制備咖啡..."); RefreshBeverage b1 = new Coffee(); b1.prepareBeverageTemplate(); System.out.println("咖啡好了!"); System.out.println(" ****************************************"); System.out.println("制備茶..."); RefreshBeverage b2 = new Tea(); b2.prepareBeverageTemplate(); System.out.println("茶好了!"); } }2-3 鉤子方法
業(yè)務(wù)場景
目前的提神飲料的步驟是固定的,當(dāng)有些人不需要加入調(diào)味料時,使用鉤子方法進行個性化擴展。
代碼編寫
1.修改RefreshBeverage類
package com.myimooc.designpattern.c8template; /** * @title 模版模式 * @describe 抽象基類,為所有子類提供一個算法框架。提神飲料 * @author zc * @version 1.0 2017-09-02 */ public abstract class RefreshBeverage { /** * 制備飲料的模版方法 * 封裝了所有子類共同遵循的算法框架 */ public final void prepareBeverageTemplate(){ // 步驟1 將水煮沸 boilWater(); // 步驟2 泡制飲料 brew(); // 步驟3 將飲料倒入杯中 pourInCup(); if (isCustomerWantsCondiments()){ // 步驟4 加入調(diào)味料 addCondiments(); } } /** * Hook 方法(鉤子函數(shù)),提供一個默認(rèn)或空的實現(xiàn) * 具體的子類可以自行決定是否掛鉤以及如何掛鉤 * 詢問用戶是否加入調(diào)料 */ protected boolean isCustomerWantsCondiments() { // 默認(rèn)需要加入調(diào)味料 return true; } /** * 基本方法,將水煮沸 */ private void boilWater() { System.out.println("將水煮沸"); } /** * 基本方法,將飲料倒入杯中 */ private void pourInCup() { System.out.println("將飲料倒入杯中"); } /** * 抽象的基本方法,泡制飲料 */ protected abstract void addCondiments(); /** * 抽象的基本方法,加入調(diào)味料 */ protected abstract void brew(); }
2.修改Tea類
package com.myimooc.designpattern.c8template; /** * @title 模版模式 * @describe 具體子類,提供了制備茶的具體實現(xiàn) * @author zc * @version 1.0 2017-09-02 */ public class Tea extends RefreshBeverage { @Override protected void addCondiments() { System.out.println("用80度的熱水浸泡茶葉5分鐘"); } @Override protected void brew() { System.out.println("加入檸檬"); } /** * 子類通過覆蓋的形式選擇掛載鉤子函數(shù) */ @Override protected boolean isCustomerWantsCondiments() { return false; } }第三章:模版模式總結(jié) 3-1 總結(jié)
模版方法模式的實現(xiàn)要素分析
抽象基類 1.基本方法:對各種具體子類而言是相同,具有共性的步驟 2.抽象方法:只知道具體原則,而不知道實現(xiàn)細(xì)節(jié),需要延遲到子類實現(xiàn)的步驟 3.鉤子方法:在基類中提供一個默認(rèn)或空的實現(xiàn),子類可以掛載及覆蓋實現(xiàn) 4.模版方法:Template方法(final),將基本方法、抽象方法、鉤子方法按照業(yè)務(wù)邏輯的需求, 匯總而成一個模版方法。一定要聲明為final,以防止被子類覆寫。 具體子類 1.實現(xiàn)基類中的抽象方法:以提供個性化的、具體的、獨特的實現(xiàn) 2.覆蓋鉤子方法:更加個性化的影響模版方法局部的行為
模版方法模式的實現(xiàn)要素
準(zhǔn)備一個抽象類,將部分邏輯以具體方法的形式實現(xiàn), 然后聲明一些抽象方法交由子類實現(xiàn)剩余邏輯, 用鉤子方法給予子類更大的靈活性。 最后將方法匯總構(gòu)成一個不可改變的模版方法。
模版方法模式的適用場景
1.算法或操作遵循相似的邏輯 2.重構(gòu)時(把相同的代碼抽取到父類中) 3.重要、復(fù)雜的算法,核心算法設(shè)計為模版算法
模版方法模式的優(yōu)點
封裝性好:封裝了一個算法的框架,將算法的具體步驟封裝成一個通用的模版方法 復(fù)用性好:抽取共性的方式,大部分代碼在父類實現(xiàn),個性化邏輯由子類實現(xiàn) 屏蔽細(xì)節(jié):很多共性作為私有方法在抽象基類中實現(xiàn),最子類屏蔽了很多細(xì)節(jié) 便于維護:好的復(fù)用性可以減少代碼框架的設(shè)計,支持更加靈活的業(yè)務(wù)變更
模版方法模式的缺點
每一個不同的實現(xiàn)都需要一個子類來實現(xiàn),導(dǎo)致類的個數(shù)增加,使得系統(tǒng)更加龐大。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70320.html
時間:2017年08月30日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:責(zé)任鏈模式簡介 1-1 課程簡介 課程大綱 什么是責(zé)任鏈模式 如何實現(xiàn)責(zé)任鏈模式 責(zé)任鏈模式如何解耦 責(zé)任鏈模式的應(yīng)用 案例:...
時間:2017年08月27日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:單例模式簡介 1-1 簡介 單例模式 概念及應(yīng)用場合 餓漢模式 懶漢模式 餓漢模式與懶漢模式的區(qū)別 什么是設(shè)計模式 是一套被反...
摘要:時間年月日星期二說明本文部分內(nèi)容均來自慕課網(wǎng)。慕課網(wǎng)教學(xué)源碼學(xué)習(xí)源碼第一章適配器模式的簡介簡介生活中的適配器翻譯軟件插座適配器適配器模式定義適配器模式講將一個類的接口,轉(zhuǎn)換成客戶期望的另外一個接口。 時間:2017年08月29日星期二說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s.....
時間:2017年08月31日星期四說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:策略模式簡介 1-1 簡介 課程大綱 什么是策略模式 策略模式如何實現(xiàn) 策略模式總結(jié)篇 實例案例分享 日常生活中的策略 Wor...
摘要:時間年月日星期日說明本文部分內(nèi)容均來自慕課網(wǎng)。這對所有形態(tài)的工廠模式都是重要的這個系統(tǒng)的產(chǎn)品有至少一個的產(chǎn)品族同屬于一個產(chǎn)品族的產(chǎn)品是設(shè)計成在一起使用的。 時間:2017年08月27日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.c...
閱讀 1902·2021-11-12 10:36
閱讀 2357·2021-09-01 10:29
閱讀 2391·2019-08-30 15:56
閱讀 1042·2019-08-30 12:56
閱讀 2374·2019-08-26 13:58
閱讀 2308·2019-08-23 18:38
閱讀 1527·2019-08-23 18:32
閱讀 2132·2019-08-23 16:53