设计模式-模板方法模式
1、模板方法模式
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。
常见的生活中模板举例:银行规定了办理业务的模板/步骤,1)进门取号;2)填写单据;3)等待叫号;4)窗口办理。第二步由具体的客户填写不同的单子,第四步银行业务员根据不同单子,做不同的业务操作
2、模板方法模式的实现要素
定义一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法交由子类实现剩余逻辑,用钩子方法给你子类更大的灵活性,最后将方法汇总构成一个不可变的模板方法。模板方法模式适用于算法或操作遵循相似的逻辑的场景
3、模板方法模式的应用--制作饮料
定义抽象基类:由算法框架、基本方法、抽象方法、钩子函数组成
package com.cn.shejimoshi.mobanfangfamoshi; /** * 抽象基类,为所有子类提供一个算法框架 * */ public abstract class RefreshBeverage { /** * 制备饮料的模板方法 * 封装了所有子类共同遵循的算法框架 */ public final void prepareBeverageTemplate(){ //步骤1 将水煮沸 boilWater(); //步骤2 泡制饮料 brew(); //步骤3 将饮料倒入杯中 pourIncup(); if (isCustomerWantCondiments()){ //步骤4 加入调味料 addCondiments(); } } /** * 钩子函数,提供一个默认或空的实现 * 具体的子类可以自行决定是否挂钩(此处特定场景表示钩子函数的返回的true或false)以及如何挂钩(钩子函数的实现逻辑) * 询问用户是否加入调料 * @return */ protected boolean isCustomerWantCondiments() { return true;//默认加入调味料 } /** * 基本方法(私有,算法框架中不会变化的步骤)--将水煮沸 */ private void boilWater() { System.out.println("将水煮沸"); } protected abstract void brew(); /** * 基本方法(私有,算法框架中不会变化的步骤)--将饮料倒入杯中 */ private void pourIncup(){ System.out.println("将饮料倒入杯中"); } protected abstract void addCondiments(); }
实现类1-Coffee
package com.cn.shejimoshi.mobanfangfamoshi; /** * 具体子类,提供了咖啡制作的具体实现 */ public class Coffee extends RefreshBeverage { @Override protected void brew() { System.out.println("用沸水冲泡咖啡"); } @Override protected void addCondiments() { System.out.println("加入糖和牛奶"); } }
实现类2-Tea
package com.cn.shejimoshi.mobanfangfamoshi; public class Tea extends RefreshBeverage { @Override protected void brew() { System.out.println("用80度的热水浸泡茶叶5分钟"); } @Override protected void addCondiments() { System.out.println("加入柠檬"); } @Override protected boolean isCustomerWantCondiments() { return false;//不加调料 } }
测试方法
package com.cn.shejimoshi.mobanfangfamoshi; import org.junit.Test; public class RefreshBeverageTest { @Test public void coffeeTest(){ RefreshBeverage refreshBeverage=new Coffee(); refreshBeverage.prepareBeverageTemplate(); } @Test public void teaTest(){ RefreshBeverage refreshBeverage=new Tea(); refreshBeverage.prepareBeverageTemplate(); } }
写在最后:
设计模式是一种经验总结、编程思想,拒绝代码的迷惑。
一种设计模式的代码变体可以有很多,但万变不离其宗。