当你在设计一个业务功能时,有一些方法/算法的结构是固定的,但其中的某些步骤可能会因不同的情境而发生不同的变化。你希望固定核心结构部分,然后灵活的去定制一些特定的步骤。这个时候可以考虑使用模板方法,通过定义一个抽象的父类,其中包含了方法/算法的核心结构,但某些步骤使用抽象方法或受保护的虚拟方法来表示,这些方法由子类来实现。这使得子类可以在不改变核心方法的同时根据需要重写特定的步骤。父类中的模板方法调用这些步骤,确保算法的整体流程一致。
假定一个网课流程的例子
/*** 抽象课程*/
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;@Overrideprotected boolean needCheckHomework() {return this.needCheckHomeWork;}@Overrideprotected void checkHomework() {System.out.println("检查Java作业");}
}/*** python课程*/
public class PythonCourse extends AbstractCourse {@Overrideprotected void checkHomework() {System.out.println("检查python作业");}
}
编写测试用例
/*** 模板方法-课程流程测试*/@Testpublic 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();}