本文源码:GitHub·点这里 || GitEE·点这里

一、生活场景

通常一款互联网应用的开发流程如下:业务需求,规划产品,程序开发,测试交付。现在基于模板方法模式进行该过程描述。

public class C01_InScene {public static void main(String[] args) {DevelopApp developApp = new DevelopApp() ;developApp.templateMethod() ;}
}
/*** 软件开发抽象类*/
abstract class SoftDevelop {public void templateMethod(){//调用基本方法doBiz ();doProduct();doDevelop();doTest();}public abstract void doBiz () ;public abstract void doProduct () ;public abstract void doDevelop () ;public abstract void doTest () ;
}
/*** APP开发具体类*/
class DevelopApp extends SoftDevelop {@Overridepublic void doBiz() {System.out.println("整理App业务");}@Overridepublic void doProduct() {System.out.println("输出App产品");}@Overridepublic void doDevelop() {System.out.println("进行App开发");}@Overridepublic void doTest() {System.out.println("进行App测试");}
}

二、模板方法模式

1、基础概念

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以用不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。简单说,模板方法模式定义流程中的核心的框架,而将实际的业务操作延迟到子类中,使得子类可以不改变流程的结构,但可以重定义业务程序。

2、模式图解

3、核心角色

  • 抽象模板角色

类中实现了模板方法(template),定义流程结构,具体业务需求子类需要去实现。

  • 具体模板角色

实现父类所定义的一个或多个抽象方法,是整个流程的组成方法。抽象模板角色都可以有任意多个具体模板角色与之对应,具体模板角色都可以给出这些抽象方法的不同实现。

4、源码实现

/*** 抽象模板角色*/
abstract class AbstractTemplate {/*** 模板方法*/public void templateMethod(){//调用基本方法abstractMethod();hookMethod();concreteMethod();}/*** 相关基本方法*/protected abstract void abstractMethod();protected void hookMethod(){}private final void concreteMethod(){}
}
/*** 具体模板角色*/
class ConcreteTemplate extends AbstractTemplate{/*** 基本方法的实现*/@Overridepublic void abstractMethod() {}/*** 重写父类的方法*/@Overridepublic void hookMethod(){}
}

5、不同方法描述

  • 模板方法

定义在抽象类中的,把基本操作方法组合在一起形成一个总流程的方法,可以有任意多个模板方法。

  • 基本方法
  1. 抽象方法:抽象方法由抽象类声明,由具体子类实现。
  2. 具体方法:具体方法由抽象类声明并实现,而子类并不实现。
  3. 钩子方法:钩子方法由抽象类声明并实现,而子类可以加以扩展。

三、JavaEE应用

HttpServlet担任抽象模板角色,模板方法:由service()方法担任。基本方法:由doPost()、doGet()等方法担任。service()方法流程,省略了部分判断逻辑。该方法调用七个do方法中的一个或几个,完成对客户端请求的响应。这些do方法需要由HttpServlet的具体子类提供,在JavaEE中使用时,通常会自己实现相关方法。在API的封装是典型的模板方法模式。

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {if (method.equals("GET")) {this.doGet(req, resp);} else if (method.equals("HEAD")) {this.doHead(req, resp);} else if (method.equals("POST")) {this.doPost(req, resp);} else if (method.equals("PUT")) {this.doPut(req, resp);} else if (method.equals("DELETE")) {this.doDelete(req, resp);} else if (method.equals("OPTIONS")) {this.doOptions(req, resp);} else if (method.equals("TRACE")) {this.doTrace(req, resp);} else {String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[]{method};errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(501, errMsg);}
}

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(19):模板方法模式相关推荐

  1. 【Java】设计模式之模板方法模式

    - 好记性不如烂笔头,特将设计模式之模板方法模式记录在我的小仓库. 文章目录 什么是模板方法模式 案例 什么是模板方法模式 简而言之就是一套算法可以适用于多个类,则进行的步骤汇总,让子类别在不改变算法 ...

  2. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

  3. Java设计模式之模板方法模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  4. C#设计模式(19)——状态者模式(State Pattern)

    原文:C#设计模式(19)--状态者模式(State Pattern) 一.引言 在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题,在本文中将首先通过一个银行账户的例子来解释 ...

  5. 一篇博客读懂设计模式之---模板方法模式

    设计模式之模板方法模式: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 简而言之就是:父类定义了骨架(调用哪些方法及其 ...

  6. 设计模式-04.模板方法模式

    设计模式-04.模板方法模式 模板方法模式 定义 介绍 实现 优点 缺点 使用场景 扩展 定义 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类 ...

  7. 设计模式之模板方法模式详解

    设计模式之模板方法模式详解 概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的 ...

  8. 初学Java常用设计模式之——原型模式

    声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...

  9. php templete什么意思,PHP设计模式之模板方法模式定义与用法详解

    本文实例讲述了PHP设计模式之模板方法模式定义与用法.分享给大家供大家参考,具体如下: 什么是模板方法模式 模板方法(Template Method)设计模式中使用了一个类方法templateMeth ...

最新文章

  1. 使用Nomad构建弹性基础架构:计划和自我修复
  2. openwrt 遍译php_[OpenWrt Wiki] OpenWrt编译 – 说明
  3. Shell 控制并发
  4. python实现随机抽取答题_如何在python中实现随机选择
  5. 4.Flow Layout Pane
  6. spark反压速率计算
  7. Windbg分析dump及调试程序
  8. selenium ruby和java_针对Ruby的Selenium WebDriver安装指南
  9. 从 ASCII 到 UTF-8 : 大话编码
  10. Android studio快捷键【Mac、Win\Linux】
  11. c语言yuv图片cb,YUV格式图像基础
  12. The Byzantine Generals Problem拜占庭将军问题理解
  13. 存储容量byte 流量单位byte
  14. 提升团队编码效率的几条经验
  15. Linux 追踪技术 ftrace 简介(一)
  16. Nginx配置 转发URL中包含特殊字符
  17. Frenet坐标系及其与笛卡尔坐标的转换(2)——原理
  18. xp系统无法使用ip地址代理服务器,xp电脑ip地址无法更改
  19. iOS程序闪退的原因以及处理办法
  20. UG/NX10二次开发学习视频目录整理(NXOPEN进阶篇)

热门文章

  1. python程序调用函数的过程_Python_自定义函数_使用_运行流程
  2. 第一个Python程序——博客自动访问脚本
  3. 修改LR自带的示例程序端口号,Cannot create GUI process-program not found
  4. 计算机网络之网络概述:3、性能指标(速率、带宽、吞吐量、时延、RTT、利用率)
  5. 3-6:类与对象下篇——构造函数中的初始化列表、匿名对象和explicit关键字
  6. qt设置路径为应用程序启动路径
  7. HVV之WIFI蜜罐反制红队
  8. Python name ‘basestring‘ is not defined
  9. Twisted twisted.python.log日志
  10. 1. OD-界面视图及基本快捷键操作,修改hello word