本文源码: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 {
@Override
public void doBiz() {
System.out.println("整理App业务");
}
@Override
public void doProduct() {
System.out.println("输出App产品");
}
@Override
public void doDevelop() {
System.out.println("进行App开发");
}
@Override
public 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{
/**
* 基本方法的实现
*/
@Override
public void abstractMethod() {
}
/**
* 重写父类的方法
*/
@Override
public 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设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  2. 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  3. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式

  4. java设计模式之模板方法模式

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

  5. Java设计模式应用——模板方法模式

    所谓模板方法模式,就是在一组方法结构一致,只有部分逻辑不一样时,使用抽象类制作一个逻辑模板,具体是实现类仅仅实现特殊逻辑就行了.类似科举制度八股文,文章结构相同,仅仅具体语句有差异,我们只需要按照八股 ...

  6. Java设计模式之模板方法模式(Template)

    前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有 ...

  7. Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)

    (一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开 ...

  8. 设计模式之模板方法模式:实现可扩展性设计(Java示例)

    概述 在实际开发中,常常会遇到一项基本功能需要支撑不同业务的情况.比如订单发货,有普通的整包发货,有分销单的发货,采购单的发货,有多商品的整包或拆包发货等.要想支持这些业务的发货,显然不能在一个通用流 ...

  9. 软件设计模式之模板方法模式(JAVA)

    什么是模板方法模式? 定义一个操作中算法的骨架,而将这些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 好抽象的概念啊,文绉绉的东西就是不讨人喜欢,下面我 ...

随机推荐

  1. MacOS 导入MySQLdb 报错解决思路(解决ImportError: this is MySQLdb version (1, 2, 3, 'beta', 1), but _mysql is version (1, 2, 5, 'final', 1))

    cd /Library/Python/2.7/site-packages ls rm -rf MySQL_python-1.2.5-py2.7.egg-info 然后重新import 即可

  2. C语言I作业004

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 作业 我在这个课程的目标是 掌握使用for循环语句实现指定次数的循环程序设计 这个作业在那个具体方面帮助我实现目标 pta运用for循环语 ...

  3. 张高兴的 .NET Core IoT 入门指南:(五)串口通信入门

    在开始之前,首先要说明的是串口通信所用到的 SerialPort 类并不包含在 System.Device.Gpio NuGet 包中,而是在 System.IO.Ports NuGet 包中.之所以 ...

  4. Tensorflow-gpu在windows10上的安装(anaconda)

    文档来源转载: http://blog.csdn.net/u010099080/article/details/53418159 http://blog.nitishmutha.com/tensorf ...

  5. Flash安全总结

    ActionScript AS是基于ECMAScript的语言,为了交互的需要flash应用引入ActionScript.ActionScript一共有三个版本,其中3.0较之前两个版本变化很大.Ac ...

  6. cobalt strike和metasploit结合使用(互相传递shell会话

    攻击机 192.168.5.173 装有msf和cs 受害机 192.168.5.179 win7 0x01 msf 派生 shell 给 Cobalt strike Msfvenom生成木马上线: ...

  7. pycharm2018.2汉化 解决设置打不开问题

    首先检查下是不是装了中文汉化包resources_cn.jar 如果有的话,解决办法:1.更换一个汉化包或者将原来的resources_en.jar也放进lib目录下 2.将汉化包都删除,只留下原版的 ...

  8. SDRAM

    环境:STM32F769discovery板  SDRAM芯片:用的MT48LC4M32B2B5-6A 16Mbyte (sdram和flash一般标的容量都是bit) 硬件图:   第一步 配置FM ...

  9. php能在手机上运行吗

    php能在手机上运行吗? php能在手机上运行.但是需要你的手机具有PHP运行环境. 比如一款安卓手机上面的php运行环境软件:anmpp. ANMPP是Android NGINX MYSQL PGS ...

  10. python编程系列---可迭代对象,迭代器和生成器详解

    一.三者在代码上的特征 1.有__iter__方法的对象就是可迭代类(对象) 2.有__iter__方法,__next()方法的对象就是迭代器3.生成器 == 函数+yield 生成器属于迭代器, 迭 ...