1、不使用模板方法设计模式
1.1 Student类
public class Student {System.out.println("学生起床");System.out.println("学生上课");System.out.println("学生放学");}
1.2 Worker类
public class Worker {System.out.println("工人起床");System.out.println("工人上班");System.out.println("工人下班");}
1.3 问题
- Student和Worker……它们的核心骨架是相同的
- 算法既然相同,为什么要在每个类中都写一遍???
- 这样做使得代码冗余……
2、使用模板方法设计模式
2.1 代码
```java public abstract class PersonTemplate { /**- templateMethod是一个模版方法,定义核心算法骨架,具体的实现步骤延迟到子类中完成
- 算法为了受到保护,所以模版方法一般都使用final修饰,不被重写
- 核心算法骨架不需要每一次在具体的类中编写了,这个核心算法只在模版方法中编写一次
- 算法步骤改变,只要更改模版就可以,同时也避免了算法在每一个具体的类中编写而冗余 / public final void templateMethod() { //核心算法骨架 do1(); do2(); do3(); } /*
- 这就是具体的实现,这个具体的步骤可以延迟到子类中完成
- 这个方法通常是抽象方法 */ protected abstract void do1(); protected abstract void do2(); protected abstract void do3(); }
//Student子类 public class Student extends PersonTemplate { @Override protected void do1() { System.out.println(“学生起床”); }
@Override
protected void do2() {
System.out.println("学生上课");
}
@Override
protected void do3() {
System.out.println("学生放学");
}
}
//Worker子类 public class Worker extends PersonTemplate{ @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) { PersonTemplate p1 = new Student(); p1.templateMethod();
PersonTemplate p2 = new Worker();
p2.templateMethod();
}
2.2 总结
- 模版方法设计模式属于行为型设计模式
- 模版方法有一个特点:doXXX()
- 模板方法设计模式的例子
- Servlet规范中的HttpServlet
- HttpServlet就是一个典型的模板方法设计模式
- HttpServlet是一个模板类
- 其中的service(HttpServletRequest, HttpServletResponse)方法是典型的模板方法,该方法中定义了核心算法骨架,doGet()、doPost()……具体的实现细节延迟到子类中完成
- Servlet规范中的HttpServlet
- 模板方法设计模式的主要作用:
- 核心算法得到保护
- 核心算法得到复用
- 在不改变算法的前提下,却可以重新定义算法步骤的具体实现
- 核心算法得到保护
