作用
- 模板方法模式: 主要实现代码复用和功能扩展;
- 代码复用: 子类复用模板方法所在类的模板流程;
- 功能扩展: 由父类(模板方法所在类)定义功能流程, 由子类去实现流程中的具体细节(即每一个具体功能函数).
- 将具体的功能实现延迟到子类去实现.
使用场景
- JUC并发包的AQS类中, Sync实现了AQS的tryAccquire()钩子函数
- Servlet的service()方法, 定义了doGet(),doPost()的执行流程, 具体实现放到子类实现;
代码模板
组成1: 模板方法所在类
package TemplateMethod;
/**
* Instruction:The template of Template Method pattern
* Author:@author MaLi
*/
public abstract class BaseTemplate {
// 关键点1:
// 模板方法, 作用: 定义流程框架
public final void templateMethod() {
System.out.println("BaseTemplate - 模板方法开始执行...");
concreteMethod1();
concreteMethod2();
concreteMethod3();
System.out.println("BaseTemplate - 模板方法执行结束!!!");
}
// 关键点2:
// 功能方法, 作用: 定义具体的细节功能
// 功能方法实现方式1: 定义为抽象方法, 子类必须继承实现
protected abstract void concreteMethod1();
// 功能方法实现方式2: 如果不继承重写, 方法体中抛出异常
protected void concreteMethod2() {
throw new UnsupportedOperationException();
}
// 功能方法实现方式3: 方法体定义默认缺省实现, 子类根据需要决定是否需要覆盖
protected void concreteMethod3() {
System.out.println("BaseTemplate - 默认实现的方法, 可以缺省, 也可以覆盖");
}
}
组成2: 子类
package TemplateMethod;
/**
* Instruction:
* Author:@author MaLi
*/
public class ConcreteClass extends BaseTemplate {
@Override
public void concreteMethod1() {
System.out.println("ConcreteClass - 强制实现的抽象方法");
}
@Override
public void concreteMethod2() {
System.out.println("ConcreteClass - 不重写就抛出异常的方法");
}
}
TestCase
package TemplateMethod;
import org.junit.Test;
/**
* Instruction:
* Author:@author MaLi
*/
public class TestConcreteClass {
@Test
public void testMethod1() {
//通过多态指向具体子类(不同的实现细节子类)
BaseTemplate baseTemplate = new ConcreteClass();
//调用父类的模板方法
baseTemplate.templateMethod();
}
}
—> 点击这里: 代码仓库地址
—> 点击这里: Java知识体系文章导航