模板方法模式(TemplateMethod)
来源:互联网 发布:淘宝日本化妆品代购 编辑:程序博客网 时间:2024/05/01 23:06
模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中实现,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
UML示例
代码示例
package com.pattern;public abstract class TemplateMethod {public static final String S1="method1";public static final String S2="method2";/** * 模板方法 * @param methodName */public final void Method(String methodName){if(S1.equals(methodName)){Method1();}else if(S2.equals(methodName)){Method2();}}protected abstract void Method1();protected abstract void Method2();}
package com.pattern;/** * 具体实现 * @author jialin * */public class Concrete extends TemplateMethod {protected void Method1() {System.out.println("Method1>>>>");}protected void Method2() {System.out.println("Method2>>>>");}}
客户端
package com.pattern;public class Client {public static void main(String[] args){Concrete con=new Concrete();//con.Method("method1");con.Method("method2");}}
模板方法在Servlet中有一个典型的应用就是HttpServlet
看一下它的源码
把多余的代码去掉,这是HttpServlet的部分代码
public abstract class HttpServlet extends GenericServlet { private static final String METHOD_DELETE = "DELETE"; private static final String METHOD_GET = "GET"; private static final String METHOD_POST = "POST"; /** * Does nothing, because this is an abstract class. */ public HttpServlet() { // NOOP } 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 doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { NoBodyResponse response = new NoBodyResponse(resp); doGet(req, response); response.setContentLength(); } 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); } } protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_put_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 doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_delete_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 service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince < (lastModified / 1000 * 1000)) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less 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 { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. // 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); } }}
其中Service方法就是典型的模板方法,我们写servlet的时候,一般要继承HttpServlet,重新DoGet,DoPost等方法,跟模板方法模式思路一致。
- TemplateMethod(模板方法模式)
- 模板方法模式(TemplateMethod)
- 模板方法模式(TemplateMethod)
- 模板方法模式(TemplateMethod)
- TemplateMethod模板方法模式
- TemplateMethod模板方法模式
- 模板方法模式(TemplateMethod)
- TemplateMethod 模板方法模式
- 9、模板方法模式(TemplateMethod)
- 模板方法模式(TemplateMethod) 简介
- 15.TemplateMethod-模板方法模式
- 15.TemplateMethod-模板方法模式
- 行为型模式之模板方法模式(TemplateMethod)
- 设计模式 -- 模板方法模式 TemplateMethod
- C++设计模式-TemplateMethod模板方法模式
- 设计模式之模板方法模式(TemplateMethod)
- C++设计模式-TemplateMethod模板方法模式
- 设计模式 模板方法模式 TemplateMethod
- 使用Set Factory2
- HBase Java 控制-1
- codeforces 280,281(Round #172)题解
- Skype和MSN联姻了
- 信用卡交易流程
- 模板方法模式(TemplateMethod)
- unity3d 带缓冲的镜头拉近效果
- qt 开发
- javascript中获取当前鼠标的坐标
- 28个Unix/Linux的命令行神器
- Coreutils - GNU core utilities
- 注解方式---spring的AOP拦截用户操作
- 理解C语言指针和数组的关系的代码
- JS中定义对象方式三: 使用构造函数方式创建对象