模板方法模式
模板方法模式主要是立足点方法,方法分为以下三种
- 抽象方法:在抽象类中声明,由具体子类实现。
- 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
- 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
依据实际情况对方法进行实现或者重写,或者不动。
以网课业务流程为例
网课业务,那么创建课程流程为:发布预习资料➡制作课件PPT➡在线直播➡提交课堂笔记➡提交源码➡布置作业➡检查作业。
假设检查作业这一项不是必须的。
public class TemplateTest {
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(false);
python.createCourse();
}
}
// 抽象课程
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("发布预习资料");
}
}
// Java课程
class JavaCourse extends AbstractCourse {
private boolean needCheckHomework = false;
public void setNeedCheckHomework(boolean needCheckHomework) {
this.needCheckHomework = needCheckHomework;
}
@Override
protected boolean needCheckHomework() {
return this.needCheckHomework;
}
@Override
protected void checkHomework() {
System.out.println("检查Java作业");
}
}
class PythonCourse extends AbstractCourse {
private boolean needCheckHomework = false;
public void setNeedCheckHomework(boolean needCheckHomework) {
this.needCheckHomework = needCheckHomework;
}
@Override
protected boolean needCheckHomework() {
return this.needCheckHomework;
}
@Override
protected void checkHomework() {
System.out.println("检查Python作业");
}
}
在 Servlet 中,每一个 Servlet 类都必须要实现 HttpServlet 接口。GenericServlet 是个通用的、不特定于任何协议的 Servlet,它实现了 Servlet 接口。而 HttpServlet 继承于 GenericServlet,为 Servlet 接口提供了处理 HTTP 协议的通用实现,所以我们定义 Servlet 时只需要继承 HttpServlet 即可。
参考资料:
1.http://c.biancheng.net/view/1376.html
代码地址:https://gitee.com/zhoujie1/design-mode-and-principle.git