使用模板模式实现课程基本流程
假设 新宝库要开发网课业务,那么创建课程流程为:发布预习资料➡制作课件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
- 大数据
- 云计算