使用模板模式实现课程基本流程
假设 新宝库要开发网课业务,那么创建课程流程为:发布预习资料➡制作课件PPT➡在线直播➡提交课堂笔记➡提交源码➡布置作业➡检查作业。
public abstract class AbstractCourse { public final void createCourse() { //1、发布预习资料 postPreResource(); //2、制作课件 createPPT(); //3、在线直播 liveVideo(); //4、提交课堂笔记 postNote(); //5、提交源码 postResource(); //6、布置作业 postHomework(); //7、检查作业 if (needCheckHomework()) { checkHomework(); } } protected abstract void checkHomework(); //钩子方法 protected boolean needCheckHomework() { return false; } protected void postHomework() { System.out.println("布置作业"); } protected void postNote() { System.out.println("提交课程笔记"); } protected void postResource() { System.out.println("提交源码"); } protected void liveVideo() { System.out.println("在线直播"); } protected void createPPT() { System.out.println("制作课件"); } protected void postPreResource() { System.out.println("发布预习资料"); } }其中的 createCourse() 是模板方法,它定义了网课业务的基本流程。postPreResource()、createPPT()、liveVideo()、postNote()、postResource()、postHomework() 这 6 个步骤在所有课程中都是固定的,只有 checkHomework() 方法在所有课程中都不一样,所以声明为抽象方法,由子类自行实现。钩子方法 needCheckHomework 返回一个 boolean 类型的值,控制是否需要检查作业。
然后创建 JavaCourse 类实现 cheakHomework() 方法,并重写 needCheckHomework() 方法。我们在《模板方法设计模式》一节已经简单了解了钩子方法,在这里再稍作解释。设计钩子方法的主要目的是干预执行流程,使得控制执行流程更加灵活,更符合实际业务的需求。钩子方法的返回值一般为条件分支语句的返回值,小伙伴们可以根据自己的业务场景决定是否需要使用钩子方法。
public class JavaCourse extends AbstractCourse { private boolean needCheckHomework = false; public void setNeedCheckHomework(boolean needCheckHomework) { this.needCheckHomework = needCheckHomework; } @Override protected boolean needCheckHomework() { return this.needCheckHomework; } protected void checkHomework() { System.out.println("检查Java作业"); } }创建 PythonCourse 类。
public class PythonCourse extends AbstractCourse { private boolean needCheckHomework = false; public void setNeedCheckHomework(boolean needCheckHomework) { this.needCheckHomework = needCheckHomework; } @Override protected boolean needCheckHomework() { return this.needCheckHomework; } protected void checkHomework() { System.out.println("检查Python作业"); } }最后,客户端测试代码如下:
public class Test { public static void main(String[] args) { System.out.println("=========Java课程start========="); JavaCourse java = new JavaCourse(); java.setNeedCheckHomework(true); java.createCourse(); System.out.println("=========Python课程start========="); PythonCourse python = new PythonCourse(); python.setNeedCheckHomework(true); python.createCourse(); } }运行结果如下:
=========Java课程start=========
发布预习资料
制作课件
在线直播
提交课程笔记
提交源码
布置作业
检查Java作业
=========Python课程start=========
发布预习资料
制作课件
在线直播
提交课程笔记
提交源码
布置作业
检查Python作业
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算