一、定义
定义一个操作中算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。
Template Method 使得子类可以不改变(复用)一个算法的结构,即可重定义(override重写)该算法的某些特定步骤。
二、假设场景
业务流程分五步,框架里面有固定的流程step1,step3,step5,应用程序使用框架,并自己编写其中的step2,step4
1、传统思路
//框架类public class Template1_lib { void step1(){ System.out.println("step1"); } void step3(){ System.out.println("step3"); } void step5(){ System.out.println("step5"); }}
//框架类public class Template1_lib { void step1(){ System.out.println("step1"); } void step3(){ System.out.println("step3"); } void step5(){ System.out.println("step5"); }}//应用程序类public class Template1_app { boolean step2(){ return true; } void step4(){ System.out.println("step4"); } /* 模拟程序流程 */ public static void main(String[] args) { Template1_lib lib = new Template1_lib(); Template1_app app = new Template1_app(); lib.step1(); if(app.step2()){ lib.step3(); } for(int i=0;i<4;i++){ app.step4(); } lib.step5(); }}
2、模板模式
public abstract class Template2_lib { protected void step1(){ System.out.println("step1"); } //稳定 protected void step3(){ System.out.println("step3"); } //稳定 protected void step5(){ System.out.println("step5"); } //稳定 //抽象方法 public abstract boolean step2(); //变化,由子类实现 public abstract void step4(); //变化,由子类实现 //稳定流程骨架 public void run(){ step1(); if(step2()){ step3(); } for(int i=0;i<4;i++){ step4(); } step5(); }}public class Template2_app extends Template2_lib{ @Override public boolean step2(){ return true; //子类重写实现 } @Override public void step4(){ System.out.println("step4"); //子类重写实现 } /* 模拟程序流程 */ public static void main(String[] args) { Template2_lib lib = new Template2_app(); //多态 lib.run(); }
三、总结
非常基础,常用
机制简洁,为很多应用程序框架提供了灵活的扩展点,
“不要调用我,让我来调用你”,反向控制
变化点与稳定点分离