摘要:時間年月日星期六說明本文部分內容均來自慕課網。案例介紹飲料機配置模版把水煮沸泡飲料把飲料倒進杯子加調味料第二章模版模式實現基本框架代碼編寫編寫類模版模式抽象基類,為所有子類提供一個算法框架。
時間:2017年09月02日星期六
說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com
教學源碼:https://github.com/zccodere/s...
學習源碼:https://github.com/zccodere/s...
內容介紹
什么是模版方法模式 如何實現模版方法模式 模版方法模式的特點 模版方法模式在項目中的應用
模板方法模式
定義了一個操作算法框架,而將一些步驟延遲到子類中實現, 使得子類在不改變一個算法結構的同時就重新定義該算法的某些特定步驟。
案例介紹:飲料機配置模版
1.把水煮沸(boilWater) 2.*泡飲料(brew)* 3.把飲料倒進杯子(pourInCup) 4.*加調味料(addCondiments)*第二章:模版模式實現 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 加入調味料 addCondiments(); } /** * 基本方法,將水煮沸 */ private void boilWater() { System.out.println("將水煮沸"); } /** * 基本方法,將飲料倒入杯中 */ private void pourInCup() { System.out.println("將飲料倒入杯中"); } /** * 抽象的基本方法,泡制飲料 */ protected abstract void addCondiments(); /** * 抽象的基本方法,加入調味料 */ protected abstract void brew(); }2-2 子類實現
代碼編寫
1.編寫Coffee類
package com.myimooc.designpattern.c8template; /** * @title 模版模式 * @describe 具體子類,提供了咖啡之中的具體實現 * @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 具體子類,提供了制備茶的具體實現 * @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 鉤子方法
業務場景
目前的提神飲料的步驟是固定的,當有些人不需要加入調味料時,使用鉤子方法進行個性化擴展。
代碼編寫
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 加入調味料 addCondiments(); } } /** * Hook 方法(鉤子函數),提供一個默認或空的實現 * 具體的子類可以自行決定是否掛鉤以及如何掛鉤 * 詢問用戶是否加入調料 */ protected boolean isCustomerWantsCondiments() { // 默認需要加入調味料 return true; } /** * 基本方法,將水煮沸 */ private void boilWater() { System.out.println("將水煮沸"); } /** * 基本方法,將飲料倒入杯中 */ private void pourInCup() { System.out.println("將飲料倒入杯中"); } /** * 抽象的基本方法,泡制飲料 */ protected abstract void addCondiments(); /** * 抽象的基本方法,加入調味料 */ protected abstract void brew(); }
2.修改Tea類
package com.myimooc.designpattern.c8template; /** * @title 模版模式 * @describe 具體子類,提供了制備茶的具體實現 * @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("加入檸檬"); } /** * 子類通過覆蓋的形式選擇掛載鉤子函數 */ @Override protected boolean isCustomerWantsCondiments() { return false; } }第三章:模版模式總結 3-1 總結
模版方法模式的實現要素分析
抽象基類 1.基本方法:對各種具體子類而言是相同,具有共性的步驟 2.抽象方法:只知道具體原則,而不知道實現細節,需要延遲到子類實現的步驟 3.鉤子方法:在基類中提供一個默認或空的實現,子類可以掛載及覆蓋實現 4.模版方法:Template方法(final),將基本方法、抽象方法、鉤子方法按照業務邏輯的需求, 匯總而成一個模版方法。一定要聲明為final,以防止被子類覆寫。 具體子類 1.實現基類中的抽象方法:以提供個性化的、具體的、獨特的實現 2.覆蓋鉤子方法:更加個性化的影響模版方法局部的行為
模版方法模式的實現要素
準備一個抽象類,將部分邏輯以具體方法的形式實現, 然后聲明一些抽象方法交由子類實現剩余邏輯, 用鉤子方法給予子類更大的靈活性。 最后將方法匯總構成一個不可改變的模版方法。
模版方法模式的適用場景
1.算法或操作遵循相似的邏輯 2.重構時(把相同的代碼抽取到父類中) 3.重要、復雜的算法,核心算法設計為模版算法
模版方法模式的優點
封裝性好:封裝了一個算法的框架,將算法的具體步驟封裝成一個通用的模版方法 復用性好:抽取共性的方式,大部分代碼在父類實現,個性化邏輯由子類實現 屏蔽細節:很多共性作為私有方法在抽象基類中實現,最子類屏蔽了很多細節 便于維護:好的復用性可以減少代碼框架的設計,支持更加靈活的業務變更
模版方法模式的缺點
每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70320.html
時間:2017年08月30日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:責任鏈模式簡介 1-1 課程簡介 課程大綱 什么是責任鏈模式 如何實現責任鏈模式 責任鏈模式如何解耦 責任鏈模式的應用 案例:...
時間:2017年08月27日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:單例模式簡介 1-1 簡介 單例模式 概念及應用場合 餓漢模式 懶漢模式 餓漢模式與懶漢模式的區別 什么是設計模式 是一套被反...
摘要:時間年月日星期二說明本文部分內容均來自慕課網。慕課網教學源碼學習源碼第一章適配器模式的簡介簡介生活中的適配器翻譯軟件插座適配器適配器模式定義適配器模式講將一個類的接口,轉換成客戶期望的另外一個接口。 時間:2017年08月29日星期二說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s.....
時間:2017年08月31日星期四說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:策略模式簡介 1-1 簡介 課程大綱 什么是策略模式 策略模式如何實現 策略模式總結篇 實例案例分享 日常生活中的策略 Wor...
摘要:時間年月日星期日說明本文部分內容均來自慕課網。這對所有形態的工廠模式都是重要的這個系統的產品有至少一個的產品族同屬于一個產品族的產品是設計成在一起使用的。 時間:2017年08月27日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.c...
閱讀 1885·2021-11-12 10:36
閱讀 2319·2021-09-01 10:29
閱讀 2354·2019-08-30 15:56
閱讀 1024·2019-08-30 12:56
閱讀 2355·2019-08-26 13:58
閱讀 2272·2019-08-23 18:38
閱讀 1494·2019-08-23 18:32
閱讀 2110·2019-08-23 16:53