当你在设计一个业务功能时,有一些方法/算法的结构是固定的,但其中的某些步骤可能会因不同的情境而发生不同的变化。你希望固定核心结构部分,然后灵活的去定制一些特定的步骤。这个时候可以考虑使用模板方法,通过定义一个抽象的父类,其中包含了方法/算法的核心结构,但某些步骤使用抽象方法或受保护的虚拟方法来表示,这些方法由子类来实现。这使得子类可以在不改变核心方法的同时根据需要重写特定的步骤。父类中的模板方法调用这些步骤,确保算法的整体流程一致。
假定一个网课流程的例子
java
/**
* 抽象课程
*/
public abstract class AbstractCourse {
protected void createPPT() {
System.out.println("制作课件");
}
protected void liveVideo() {
System.out.println("教学直播");
}
protected void postNote() {
System.out.println("上传课堂笔记");
}
protected void postHomeWork() {
System.out.println("布置作业");
}
protected boolean needCheckHomework() {
return false;
}
protected abstract void checkHomework();
public final void createCourse() {
createPPT();
liveVideo();
postNote();
postHomeWork();
if (needCheckHomework()) {
checkHomework();
}
}
}
/**
* java课程
*/
@Setter
public class JavaCourse extends AbstractCourse {
private boolean needCheckHomeWork = false;
@Override
protected boolean needCheckHomework() {
return this.needCheckHomeWork;
}
@Override
protected void checkHomework() {
System.out.println("检查Java作业");
}
}
/**
* python课程
*/
public class PythonCourse extends AbstractCourse {
@Override
protected void checkHomework() {
System.out.println("检查python作业");
}
}
编写测试用例
java
/**
* 模板方法-课程流程测试
*/
@Test
public void testTemplateMethod() {
System.out.println("======Java课程======");
JavaCourse javaCourse = new JavaCourse();
javaCourse.setNeedCheckHomeWork(true);
javaCourse.createCourse();
System.out.println("======Python课程======");
PythonCourse pythonCourse = new PythonCourse();
pythonCourse.createCourse();
}