定义
指定义一个算法骨架,并允许子类为其中的一个或者多个步骤提供实现
模板方法使得子类在不改变算法的结构下重新定义算法的某些步骤
适用场景
- 一次性实现一个算法不变的部分,可变的部分由子类实现
- 各子类中公共的行为被提取出来并集中到一个公共的父类中,避免代码的重复
实例
public abstract class CourseTemplate {
public boolean ischeck = false;
public void setIscheck(boolean ischeck) {
this.ischeck = ischeck;
}
public final void createCourse() {
// 发布预习资料
postPreResource();
// 制作ppt
createPPT();
// 直播授课
videoTeach();
// 发布笔记
postResource();
// 发布课后作业
postHomework();
// 检查课后作业(钩子方法)
if (isCheckHomework()) {
checkHomework();
}
}
public abstract void checkHomework();
public abstract boolean isCheckHomework();
private void postHomework(){
System.out.println("发布课后作业");
}
private void postResource(){
System.out.println("发布笔记");
}
private void videoTeach(){
System.out.println("直播授课");
}
private void createPPT(){
System.out.println("制作ppt");
}
private void postPreResource(){
System.out.println("发布预习资料");
}
}
public class JavaCourse extends CourseTemplate {
@Override
public void checkHomework() {
System.out.println("检查java作业");
}
@Override
public boolean isCheckHomework() {
return this.ischeck;
}
}
public class CCourse extends CourseTemplate {
@Override
public void checkHomework() {
System.out.println("检查c作业");
}
@Override
public boolean isCheckHomework() {
return this.ischeck;
}
}
public class Test {
public static void main(String[] args) {
CourseTemplate java = new JavaCourse();
java.setIscheck(true);
java.createCourse();
System.out.println("+++++++++++++++++++++++++++++");
CourseTemplate c = new CCourse();
c.setIscheck(true);
c.createCourse();
}
}
应用
- jdbcTemplate
- AbstractList - get
- Servlet - doget/dopost
- mybatis - BaseExcute - doupdate - doquery
优点
- 相同的逻辑放到抽象父类中,提高代码的复用性
- 不同的代码放到不同的子类中,通过对子类的扩展,增加新的行为提高代码的扩展性
- 把不变的行为写在父类上,去除子类重复代码,符合开闭原则
缺点
- 每个抽象类都需要一个子类来实现,导致类的数量增加
- 类数量的增加,增加了系统实现的复杂度
- 继承关系自身缺点,父类添加新的抽象方法,所有子类都需要修改