博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板方法模式(TemplateMethod)
阅读量:4579 次
发布时间:2019-06-08

本文共 5723 字,大约阅读时间需要 19 分钟。

 

模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中实现,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

 

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等方法,跟模板方法模式思路一致。

 

 

 

转载于:https://www.cnblogs.com/jiangu66/archive/2013/05/10/3072012.html

你可能感兴趣的文章
C++智能指针
查看>>
ANDROID L——Material Design综合应用(Demo)
查看>>
django使用户名和邮箱都能登录
查看>>
第一章 AT&T
查看>>
Java是否可用public成员变量?
查看>>
DNS解析原理和流程
查看>>
【rust】-使用cargo创建项目及cargo源的替换
查看>>
json返回hibernate的结果会自动调用(get)查询出关联表的数据,解决方法
查看>>
lesson - 12 Linux系统日常管理1
查看>>
简练网软考知识点整理-蒙特卡洛模拟
查看>>
XMPP协议的原理介绍
查看>>
设计模式(3)-- 原型模式 (clone分析)
查看>>
删除U8中单据已经审核完成但工作流未完成的任务
查看>>
@mentions for Users with ActionText; 使用Tribute.js库
查看>>
方法返回前面有if - else if - else ,最终返回值是?
查看>>
编译环境
查看>>
获取用户的邮箱地址的几个方法
查看>>
个人作业(二)
查看>>
黄金点游戏
查看>>
ubuntu安装,配置ftp服务器
查看>>