一、概述

  定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤

1.1、适用场景

  一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现

  各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复

  一些方法通用,一些却在每一个子类都重新写了这一方法。

  Template Method模式一般应用在具有以下条件的应用中:

    1、具有统一的操作步骤或操作过程

    2、具有不同的操作细节

    3、存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同

1.2、优缺点

优点:

  • 提高复用性,提取公共代码,便于维护
  • 提高扩展性
  • 符合开闭原则
  • 行为由父类控制,子类实现

缺点:

  • 类数目增加
  • 增加了系统实现的复杂度
  • 如果父类添加新的抽象方法,所有子类都要改一遍

注意:为防止恶意操作,一般模板方法都加上 final 关键词。

1.3、类图角色及其职责

  

  模板方法模式的角色和职责

  1、AbstractClass:抽象类的父类

  2、ConcreteClass:具体的实现子类

  3、templateMethod():模板方法,具体步骤方法的执行顺序(步骤)

  4、method1()与method2():具体步骤方法(细节)

1.4、演进过程

  代码来实现一下:我们举个例子,加入我们要组装汽车,步骤是,先组装车头,再组装车身,最后组装车尾,喷漆,是否需要打蜡

  这样,我们先建造AbstractClass(其中包含template模板,执行顺序)

// 组装车(AbstractClass)
public abstract class MakeCar {
//定义结构里哪些方法是所有过程都是一样的可复用的,哪些是需要子类进行实现的
//组装车头
public abstract void makeCarHead(); //组装车身
public abstract void makeCarBody(); //组装车尾
public abstract void makeCarTail(); //喷漆 都一样 统一实现
public void makeCarPaint() {
System.out.println("汽车喷漆");
} //打蜡
public abstract void makeCarDaLa(); //声明一个钩子方法 需要打蜡 由用户确认 是否需要
protected boolean needMakeCarDaLa() {
return true;
} //汽车组装流程(template()) 用来控制流程
//申明为final,不希望子类覆盖这个方法,防止更改流程的执行顺序
public final void makeCar() {
this.makeCarHead();
this.makeCarBody();
this.makeCarTail();
this.makeCarPaint();
// 这里是否需要 交由钩子方法来决定
if (needMakeCarDaLa()) {
this.makeCarDaLa();
}
}
}

  再新建ConcreteClass(具体的实现细节)

//组装公交车
public class MakeBus extends MakeCar{ @Override
public void makeCarHead() {
System.out.println("组装公交车车头");
} @Override
public void makeCarBody() {
System.out.println("组装公交车车身");
} @Override
public void makeCarTail() {
System.out.println("组装公交车车尾");
} @Override
public void makeCarDaLa() { } @Override
protected boolean needMakeCarDaLa() {
return false;
}
}
//  组装SUV
public class MakeSuv extends MakeCar{ @Override
public void makeCarHead() {
System.out.println("组装SUV车头");
} @Override
public void makeCarBody() {
System.out.println("组装SUV车身");
} @Override
public void makeCarTail() {
System.out.println("组装SUV车尾");
} @Override
public void makeCarDaLa() {
System.out.println("组装SUV-打蜡");
}
}

测试

    @Test
public void makeCar() {
MakeCar makeBus = new MakeBus();
makeBus.makeCar(); System.out.println("==========================="); MakeCar makeSuv = new MakeSuv();
makeSuv.makeCar();
}

  用户不必关心具体的执行流程(步骤)

  输出

组装公交车车头
组装公交车车身
组装公交车车尾
汽车喷漆
===========================
组装SUV车头
组装SUV车身
组装SUV车尾
汽车喷漆
组装SUV-打蜡

二、扩展

  spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。

  jdk:java.util.AbstractList定义一套算法模板,如get(),set()等等,由子类实现。

  servlet:javax.servlet.http.HttpServlet定义一套算法模板,如doGet()、doPost()等等,由子类实现。。

  mybatis:org.apache.ibatis.executor.BaseExecutor

004-行为型-02-模板方法模式(Template Method)的更多相关文章

  1. 【设计模式】行为型02模板方法模式(Template Method Patten)

    五一长假,没有出去,不喜欢嘈杂的人群,玩了会游戏发泄了下憋在心底的戾气,手旁大马克杯里是母亲泡的绿茶.点开自己的播放列表,耳机里传来的是理查德克莱德曼的致爱丽丝.自己是个凡人,卑微渺小的活着.不说废话 ...

  2. 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

      设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...

  3. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图   相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...

  4. 模板方法模式(Template Method Pattern)——复杂流程步骤的设计

    模式概述 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单. 在 ...

  5. 设计模式 - 模板方法模式(template method pattern) JFrame 具体解释

    模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(templ ...

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

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

  7. 模板方法模式-Template Method(Java实现)

    模板方法模式-Template Method 在模板模式中, 处理的流程被定义在父类中, 而具体的处理则交给了子类. 类关系图很简单: Template接口 这里定义了子类需要实现的方法(before ...

  8. 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释

    模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(tem ...

  9. 设计模式 - 模板方法模式(template method pattern) 具体解释

    模板方法模式(template method pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template metho ...

  10. 二十四种设计模式:模板方法模式(Template Method Pattern)

    模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...

随机推荐

  1. window下关闭占用端口使用

    怎么在window下关闭端口! 1:查看特定端口被占用情况 命令:   netstat -ano 和 netstat -ano|findstr 端口号 netstat -ano:查看电脑所有端口被占用 ...

  2. WPF + SelfHost 实现窗体自宿主(API,API和窗体通信)

    前言 今天研究了在 WPF 中使用 SelfHost 自宿主. 具体的功能是,在 WPF 中使用自宿主服务,外部调用服务的 API,在 API 里面操作窗体的显示等. 技术点 在 WPF 中集成 Se ...

  3. 《代码敲不队》第九次团队作业:Beta冲刺第2天

    项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 代码敲不队 作业学习目标 (1)项目文档的完善与整理:(2)团队项目总结陈述PPT编制:(3)符合 ...

  4. AOP与Filter拦截请求打印日志实用例子

    相信各位同道在写代码的时候,肯定会写一些日志打印,因为这对往后的运维而言,至关重要的. 那么我们请求一个restfull接口的时候,哪些信息是应该被日志记录的呢? 以下做了一个基本的简单例子,这里只是 ...

  5. 2019-2020-1 20199301《Linux内核原理与分析》第六周作业

    第五章 系统调用的三层机制(下) 1.给MenuOS增加命令 代码如下: rm -rf menu git clone http://github.com/mengning/menu.git make ...

  6. #define的一个小技巧

    /* atof example: sine calculator */ #include <stdio.h> /* printf, fgets */ #include <stdlib ...

  7. c99的新功能

    在ANSI的标准确立后,C语言的规范在一段时间内没有大的变动,然而C++在自己的标准化创建过程中继续发展壮大.<标准修正案一>在1994年为C语言创建了一个新标准,但是只修正了一些C89标 ...

  8. jquery 如何控制音乐打开和关闭

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. PHP流程控制之goto语法

    自 PHP 5.3.0 起,还可以使用 goto 来跳出循环. 在本章开始的章节,我们讲解到一个故事,王同学每周往返,但有一个特例:直线电机滑台 项目失败后或者集团临时除知除外,他就可以不再这么每周往 ...

  10. 013——MATLAB硬件支持包离线下载

    (一)参考文献:https://blog.csdn.net/hyperorbit/article/details/88095384 (二)去下列网址下载离线包下载工具:https://ww2.math ...