设计模式之模版模式
来源:互联网 发布:ptc是什么软件 编辑:程序博客网 时间:2024/05/19 16:02
设计模式之模版模式
1. 概述
模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
- 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
- 何时使用:有一些通用的方法。
- 如何解决:将这些通用算法抽象出来。
- 关键代码:在抽象类实现,其他步骤在子类实现。
2. 代码实现
public abstract class AbstractC { public void run(){ start(); doWork(); end(); } public abstract void doWork(); public void end() { System.out.println("end..."); } public void start() { System.out.println("first, start---"); }}
public class WorkA extends AbstractC{ @Override public void doWork() { System.out.println("workA do work"); }}
public class WorkB extends AbstractC{ @Override public void doWork() { System.out.println("WorkB do work"); }}
/** * 模版方法模式 * * 父类声明抽象方法,子类做具体实现 * 父类引用指向子类实现, 调用具体子类的重写方法 * */public class Main { public static void main(String[] args) { AbstractC workA = new WorkA(); AbstractC workB = new WorkB(); workA.run(); workB.run(); }}
3. 应用场景
模板方法模式在Servlet中的应用
使用过Servlet的人都清楚,除了要在web.xml做相应的配置外,还需继承一个叫HttpServlet的抽象类。HttpService类提供了一个service()方法,这个方法调用七个do方法中的一个或几个,完成对客户端调用的响应。这些do方法需要由HttpServlet的具体子类提供,因此这是典型的模板方法模式。下面是service()方法的源代码:
protectedvoid 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); } } } elseif (method.equals(METHOD_HEAD)) { long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp); } elseif (method.equals(METHOD_POST)) { doPost(req, resp); } elseif (method.equals(METHOD_PUT)) { doPut(req, resp); } elseif (method.equals(METHOD_DELETE)) { doDelete(req, resp); } elseif (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } elseif (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例子:
从上面的类图可以看出,TestServlet类是HttpServlet类的子类,并且置换掉了父类的两个方法:doGet()和doPost()。
publicclass TestServlet extends HttpServlet { publicvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("using the GET method"); } publicvoid doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("using the POST method"); }}
从上面的例子可以看出这是一个典型的模板方法模式。
HttpServlet担任抽象模板角色
模板方法:由service()方法担任。
基本方法:由doPost()、doGet()等方法担任。
TestServlet担任具体模板角色
TestServlet置换掉了父类HttpServlet中七个基本方法中的其中两个,分别是doGet()和doPost()。
0 0
- 设计模式之模版模式
- 设计模式 之 模版模式
- 设计模式之模版模式
- 设计模式之模版模式
- 设计模式之模版模式
- 02 设计模式之--模版设计模式
- 设计模式之:模版设计模式
- 设计模式之模版设计模式
- 设计模式之_模版设计模式
- 设计模式之Template(模版)
- 设计模式之模版方法
- 设计模式之模版方法模式
- 设计模式之模版方法模式
- java 设计模式之三-模版模式
- 设计模式之模版方法模式
- 大话设计模式之模版方法模式
- 设计模式之模版方法模式
- 设计模式之模版方法模式
- 开源APP项目代码分析(4)- 天气类
- 深度森林:探索深度神经网络以外的方法
- 布局优化
- 异构计算
- ARM9与FPGA并口通信的实现
- 设计模式之模版模式
- Hive2.1.1的安装(hadoop版本2.7.3)
- 关于置信传播算法(Belief Propagation)的一些理解与记录
- 程序员养成这16个好习惯,离成功就不远了
- 小飞鱼通达商务平台课程 OA开发程序基础课 3月4日 PHP第一部分课程签到及作业
- Spark官方文档之Tuning Spark复习笔记-7
- python 简单的窗口提示
- VMware虚拟机Mac OS X无法调整扩展硬盘大小,更新xcode时出现磁盘空间不足
- Hadoop history