设计模式 一一一 模板方法模式


模板方法:
	目的:让模板的实现类来实现模板中固定逻辑(骨架)的具体步骤,从而达到一个固定逻辑可以对应n个具体的实现。
		
	角色:
		模板类 				提供模板方法。
		模板方法			指定逻辑的骨架,骨架由多个基本方法构成。
		基本方法			骨架的一部分。
		
		模板的具体实现类	继承模板类,对模板类中的基本方法进行自定义。
		基本方法的具体实现	自定义基本方法的具体实现。

		
jdk中的模板方法模式:
	/*
	 * 模板类HttpServlet
	 */
	public abstract class HttpServlet extends GenericServlet implements java.io.Serializable {

		/*
		 * 模板方法service(),制定逻辑的骨架。逻辑的骨架由多个基本方法构成。基本方法的具体实现由子类来完成。
		 */
		protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
			String method = req.getMethod();

			if (method.equals(METHOD_GET)) {
				long lastModified = getLastModified(req);
				if (lastModified == -1) {
					doGet(req, resp); // 基本方法
				} else {
					long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
					if (ifModifiedSince < (lastModified / 1000 * 1000)) {
						maybeSetLastModified(resp, lastModified);
						doGet(req, resp);
					} else {
						resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
					}
				}
			} else if (method.equals(METHOD_HEAD)) {
				long lastModified = getLastModified(req);
				maybeSetLastModified(resp, lastModified);
				doHead(req, resp); 	// 基本方法
			} else if (method.equals(METHOD_POST)) {
				doPost(req, resp); 	// 基本方法
			} else if (method.equals(METHOD_PUT)) {
				doPut(req, resp);	// 基本方法
			} else if (method.equals(METHOD_DELETE)) {
				doDelete(req, resp);	// 基本方法
			} else if (method.equals(METHOD_OPTIONS)) {
				doOptions(req,resp);	// 基本方法
			} else if (method.equals(METHOD_TRACE)) {
				doTrace(req,resp);	// 基本方法
			} else {
				String errMsg = lStrings.getString("http.method_not_implemented");
				Object[] errArgs = new Object[1];
				errArgs[0] = method;
				errMsg = MessageFormat.format(errMsg, errArgs);
				resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
			}
		}
		
		/*
		 * 基本方法,具体的实现由子类来完成。
		 */
		protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			String protocol = req.getProtocol();
			String msg = lStrings.getString("http.method_get_not_supported");
			if (protocol.endsWith("1.1")) {
				resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
			} else {
				resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
			}
		}
		
		protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			String protocol = req.getProtocol();
			String msg = lStrings.getString("http.method_post_not_supported");
			if (protocol.endsWith("1.1")) {
				resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
			} else {
				resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
			}
		}
	}


	/*
	 * 模板的具体实现类
	 */
	public class MyHttpServlet extends HttpServlet {

		/*
		 * 基本方法的具体实现
		 */
		protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			// 自定义的处理逻辑
		}
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值