一、概述

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

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. robot framework 笔记(一)

    背景: 平时使用rf时会用到一些方法,长时间不用就会忘记,本文用来记录当做自己的小笔记 内容持续更新中········ 一.robot framework 大小写转换 1.转换小写: ${low} E ...

  2. Mysql 查询当天、昨天、近7天、一周内、本月、上一月等的数据(函数执行日期的算术运算)

    注:where语句后中的字段last_login_time 替换成 时间字段名 即可 #查询昨天登录用户的账号 ; #查询当天登录用户的账号 ; #查询所有last_login_time值在最后1天内 ...

  3. 【Mac电脑】Burp 设置代理后提示“您的链接不是私密链接”的解决方案

    一.遇到的问题 通过Burp Proxy代理抓包时,遇到的如下情况: 二.解决问题 (1)基础介绍 HTTPS协议是为了数据传输安全的需要,在HTTP原有的基础上,加入了安全套接字层SSL协议,通过C ...

  4. Redis 缓存失效机制

    Redis缓存失效的故事要从EXPIRE这个命令说起,EXPIRE允许用户为某个key指定超时时间,当超过这个时间之后key对应的值会被清除,这篇文章主要在分析Redis源码的基础上站在Redis设计 ...

  5. C++template基础

    函数模板 类模板 参数魔法 模板与友元

  6. [Angular 8] Keep original DOM structure with ng-container

    ng-container is using for grouping elments together, a bit similar to div. If you want to group some ...

  7. Tensorflow细节-P190-输入文件队列

    以下代码要学会几个地方 1.filename = ('data.tfrecords-%.5d-of-%.5d' % (i, num_shards)) 这个东西就是要会data.tfrecords-%. ...

  8. CSS3新增选择器:伪元素选择器

    一.  ::first-letter 第一个字 二. ::first-line 第一行(以浏览器为准的第一行) 三. ::selection 被选中的字行(鼠标选中的字段)只能向 ::selectio ...

  9. 10分钟用Python告诉你两个机器人聊天能聊出什么火花

    欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 现在不是讲各种各样的人工智能嘛,AI下棋,AI客服,AI玩家--其实我一直很好奇,两个AI碰上会怎样,比如一起下棋,一起打游戏-- 今天做个 ...

  10. __enter__,__exit__区别

    __enter__():在使用with语句时调用,会话管理器在代码块开始前调用,返回值与as后的参数绑定 __exit__():会话管理器在代码块执行完成好后调用,在with语句完成时,对象销毁之前调 ...