问题:
有两个类学生类和工人类如下
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("工人-睡觉");
}
}
Test
public class Test {
public static void main(String[] args) {
Student s=new Student();
s.day();
Worker w=new Worker();
w.day();
}
}
Student和Worker核心算法骨架相同,代码冗余,且每一个类都编写一边算法,算法无法保护。
解决:采用模板方法设计模式
模板类
package 模版方法设计模式;
/**
* PersonTemplate符合模版方法设计模式
* PersonTemplate类是一个模板类
* 模版类通常是抽象类
* 模板方法设计模式:在不改变算法的前提下,重新定义算法步骤的具体实现
*/
public abstract class PersonTemplate {
/**
* templateMethod是一个模版方法,定义核心算法骨架,具体的实现步骤延迟到子类中完成
* 算法为了受到保护,所以模版方法一般被final修饰
* 核心算法骨架不需要每一个类都编写了,这个核心算法只在模版方法中编写了一次
*/
public final void templateMethod() {
//核心算法骨架
do1();
do2();
do3();
}
/**
* 具体的实现步骤延迟到子类中完成
* 方法通常是抽象方法
*/
public abstract void do3();
public abstract void do2();
public abstract void do1();
}
学生类和工人类
package 模版方法设计模式;
public class Student extends PersonTemplate
{
@Override
public void do3() {
System.out.println("学生-起床");
}
@Override
public void do2() {
System.out.println("学生-上课");
}
@Override
public void do1() {
System.out.println("学生-睡觉");
}
}
package 模版方法设计模式;
public class Worker extends PersonTemplate
{
@Override
public void do3() {
System.out.println("工人-起床");
}
@Override
public void do2() {
System.out.println("工人-上班");
}
@Override
public void do1() {
System.out.println("工人-睡觉");
}
}
Test
package 模版方法设计模式;
public class Test {
public static void main(String[] args) {
Student s=new Student();
s.templateMethod();;
Worker w=new Worker();
w.templateMethod();
}
}
结果
总结
模版方法设计模式典型应用HttpServlet
Servlet规范中的HttpServlet
HttpServlet是一个模版类
其中的service(HttpServletRequest,HttpServletResponse)方法是典型的模板方法
doGet,doPost…具体的实现步骤延迟到子类中去完成.
public class HttpServlet extends GenericServlet
{
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
service(request,response);
}
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String method = request.getMethod();
if ("GET".equals(method)){
doGet(request,response);
}else if ("POST".equals(method)){
doPost(request,response);
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("405-应该发送POST请求");
throw new RuntimeException("405-应该发送POST请求");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("405-应该发送GET请求");
throw new RuntimeException("405-应该发送GET请求");
}
}
HttpServelet具体实现子类(接受登陆请求)
package com.chif;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class LoginServlet extends javax.servlet.http.HttpServlet
{
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("login......");
}
}
模版方法设计模式的特点
doXXX
doYYY
doZZZ
模版方法设计模式的主要作用
1.核心算法得到保护
2.核心算法得到复用
3.在不改变算法的前提下,可以重新定义算法步骤的具体实现。