简介:模板方法重要的角色为抽象类和具体子类,钩子方法是模板模式的核心部分。
模板方法模式
角色
- AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架。
- ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
基本方法
基本方法是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:
- 抽象方法:一个抽象方法由抽象类声明、由其具体子类实现
- 具体方法:一个具体方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。
- 钩子方法:可以与一些具体步骤 “挂钩” ,以实现在不同条件下执行模板方法中的不同步骤
示例
public abstract class ACourse {
//模板方法,定义了制作网课的基本流程
protected final void makeCourse() {
this.makePPT();
this.makeVideo();
if (needWriteArticle()) {
this.writeArticle();
}
this.packageCourse();
}
final void makePPT() {
System.out.println("1. 制作PPT");
}
final void makeVideo() {
System.out.println("2. 制作视频");
}
final void writeArticle() {
System.out.println("3. 编写课程笔记");
}
//钩子方法,控制是否要编写笔记
protected boolean needWriteArticle() {
return false;
}
//在各个课程中不一样,所以声明为抽象放啊
abstract void packageCourse();
}
子类 FECourse,实现了抽象方法 packageCourse,重写了钩子方法 needWriteArticle,其中把钩子方法的结果交给客户端确定
public class FECourse extends ACourse {
private boolean needWriteArticleFlag = false;
@Override
void packageCourse() {
System.out.println("4.1 提供课程的前端代码");
System.out.println("4.2 提供课程的图片等多媒体素材");
}
public FECourse(boolean needWriteArticleFlag) {
this.needWriteArticleFlag = needWriteArticleFlag;
}
@Override
protected boolean needWriteArticle() {
return this.needWriteArticleFlag;
}
}
客户端测试
public class Test {
public static void main(String[] args) {
System.out.println("前端课程start---");
ACourse feCourse = new FECourse(false);
feCourse.makeCourse();
System.out.println("前端课程end---");
}
}
- 每一个 Servlet 都必须要实现
Servlet
接口,GenericServlet
是个通用的、不特定于任何协议的Servlet,它实现了 Servlet 接口,而HttpServlet
继承于GenericServle
t,实现了 Servlet 接口,为 Servlet 接口提供了处理HTTP协议的通用实现,所以我们定义的 Servlet 只需要继承HttpServlet
即可。 - HttpServlet 相当于定义了一套处理 HTTP 请求的模板;
service
方法为模板方法,定义了处理HTTP请求的基本流程;doXXX 等方法为基本方法,根据请求方法做相应的处理,子类可重写这些方法;HttpServletRequest
中的Method
则起到钩子方法的作用。