模版方法设计模式
未使用模板方法设计模式
首先看一个不使用模版方法设计模式的几个类
可以将Student类和Worker类中的day()方法内的代码看作是算法,可以发现,Student类和Worker类的算法相同,不同的只是算法的每一个步骤的具体实现细节。
两个类中的算法相同,每个类也都要写一遍,代码冗余,而且修改算法步骤也不方便
public class Student {
/**/
public void day(){
System.out.println("学生起床");
System.out.println("学生上课");
System.out.println("学生放学");
}
}
public class Worker {
public void day(){
System.out.println("工人起床");
System.out.println("工人上班");
System.out.println("工人下班");
}
}
/*测试类*/
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.day();
Worker worker = new Worker();
worker.day();
}
}
使用模版方法设计模式
-
Person类
templateMethod()是一个模版方法,定义核心算法骨架,具体的实现步骤延迟到子类中完成
算法为了受到保护,所以模版方法一般都使用final修饰,不被重写
核心算法骨架不需要每一次在具体的类中编写了,这个核心算法只在模版方法中编写一次
算法步骤改变,只要更改模版就可以,同时也避免了算法在每一个具体的类中编写而冗余
-
Student类 Worker类
Student和Worker只需要关心算法的具体实现细节即可,不需要关心算法的步骤
也不需要在每一个类中都写上算法,这样避免了代码冗余,增加了模板方法的代码通用性
修改代码的算法步骤也只需要修改模板类即可
public abstract class Person {
/**
* templateMethod是一个模版方法,定义核心算法骨架,具体的实现步骤延迟到子类中完成
* 算法为了受到保护,所以模版方法一般都使用final修饰,不被重写
* 核心算法骨架不需要每一次在具体的类中编写了,这个核心算法只在模版方法中编写一次
* 算法步骤改变,只要更改模版就可以,同时也避免了算法在每一个具体的类中编写而冗余
*/
public final void templateMethod() {
//核心算法骨架
do1();
do2();
do3();
}
/**
* 这就是具体的实现,这个具体的步骤可以延迟到子类中完成
* 这个方法通常是抽象方法
*/
protected abstract void do1();
protected abstract void do2();
protected abstract void do3();
}
public class Student extends Person {
@Override
protected void do1() {
System.out.println("学生起床");
}
@Override
protected void do2() {
System.out.println("学生上课");
}
@Override
protected void do3() {
System.out.println("学生放学");
}
}
public class Worker extends Person{
@Override
protected void do1() {
System.out.println("工人起床");
}
@Override
protected void do2() {
System.out.println("工人上班");
}
@Override
protected void do3() {
System.out.println("工人下班");
}
}
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.templateMethod();
Worker worker = new Worker();
worker.templateMethod();
}
}
总结
模版方法设计模式属于行为行设计模式
模版方法有一个特点:doXXX()
模板方法设计模式的主要作用:
- 核心算法得到保护
- 核心算法得到复用
- 在不改变算法的前提下,却可以重新定义算法步骤的具体实现
模板方法设计模式的例子
-
Servlet规范中的HttpServlet
-
HttpServlet就是一个典型的模板方法设计模式
-
HttpServlet是一个模板类
-
其中的service(HttpServletRequest, HttpServletResponse)方法是典型的模板方法,该方法中定义了核心算法骨架,doGet()、doPost()…具体的实现细节延迟到子类中完成