模版方法设计模式【JAVAEE基础】

问题:

有两个类学生类和工人类如下

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.在不改变算法的前提下,可以重新定义算法步骤的具体实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值