参考文章:
https://www.cnblogs.com/fengshenjingjun/p/8067855.html
https://yq.aliyun.com/articles/675872
1.定义
定一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
1.1 模板模式中有两个角色,抽象模板角色定义了一个或多个抽象操作以便让子类实现,定义并实现了一个模板方法,这个方法包含了一些不可改变的方法执行顺序。
1.2 具体模板角色实现父类定义的一个或多个抽象方法,每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现。
模板模式中,在抽象模板中定义了方法的执行顺序,而方法的实现可以选择让子类去定制化;另外,统一的不变的方法可以放在抽象模板类中,这样子类可以共用。
1.3 模板模式中还经常会出现钩子方法,一般是由抽象类给出方法的空实现,然后子类进行覆写。这种空的钩子方法叫做“Do Nothing Hook”。
钩子方法放到模板方法中,就可以实现生命周期中方法的自定义,例如beforeCreate、beforeUpdate、afterUpdate、afterCreated等。
2.模板模式实例
父类CaffeineBeverage:
package com.xly.template; public abstract class CaffeineBeverage { //算法的框架:不期望子类改变算法的结构,声明为final public final void prepareRecipe() { //算法的具体步骤 this.boilWater(); //烧水:不变 this.brew();//冲泡:可变 this.pourInCup();// 把饮料倒入杯子:不变 if(this.hook()){ this.addCondiments();// 加调料 :子类可控制 } } protected void boilWater() { System.out.println("烧水"); } protected void pourInCup() { System.out.println("把饮料倒入杯子"); } protected boolean hook() {//使用钩子可让子类有自主权 return true; } protected abstract void brew(); protected abstract void addCondiments(); }
子类Coffee
package com.xly.template; public class Coffee extends CaffeineBeverage { @Override protected void brew() { System.out.println("用沸水冲泡咖啡粉"); } @Override protected void addCondiments() { System.out.println("加糖和牛奶"); } @Override protected boolean hook() { return false; } }
子类Tea:
package com.xly.template; public class Tea extends CaffeineBeverage { @Override protected void brew() { System.out.println("用沸水侵泡茶叶"); } @Override protected void addCondiments() { System.out.println("加柠檬"); } @Override protected boolean hook() { return false; } }
测试类:TemplateMethodTest
public class TemplateMethodTest { public static void main(String[] args) { CaffeineBeverage caffeineBeverage = new Tea(); caffeineBeverage.prepareRecipe(); System.out.println("-------------------"); caffeineBeverage = new Coffee(); caffeineBeverage.prepareRecipe(); } }
3. 模板模式应用
JDBC模板
未完待续