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