一、概述

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

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. 思想家:一个http接口的设计

    一个简单的接口,反应出来一些简单的思想. auth_token= xxx post  response (命令) 记住:我们是给第3方提供接口,不是自己使用 问题:平时就知道写代码,文档重视不够,有一 ...

  2. kvm创建win7虚拟机默认只识别2个cpu解决方法

    现在人在部署OpenStack之后会发现按照配额运行Linux的虚拟机没有问题,但是运行windows的虚拟机会发现如果配置2个以上的核则无法识别,windows server也最多支持到4个核.无法 ...

  3. 快速开平方取倒数的算法--嵌入式ARM转载

    #include<stdio.h> #include<string.h> #include <stdlib.h> /* atof */ /* 计算=1/sqrt(n ...

  4. Vue基础入门笔记

    不是面向DOM进行编程,而是面向数据去编程.当数据发生改变,页面就会随着改变. 属性绑定(v-bind)和双向数据绑定(v-model) 模板指令(v-bind:)后面跟的内容不再是字符串而是: js ...

  5. Tensorflow 细节P-40

    1.绝大部分时候都会忽略graph的使用,如下代码所示,学会怎样tf.get_default_graph()是重要的,此外注意变量定义时的初始化必须加 initializer 2.此外,要知道 wri ...

  6. SIGAI机器学习第二十二集 AdaBoost算法3

    讲授Boosting算法的原理,AdaBoost算法的基本概念,训练算法,与随机森林的比较,训练误差分析,广义加法模型,指数损失函数,训练算法的推导,弱分类器的选择,样本权重削减,实际应用. AdaB ...

  7. 获取当前主题颜色 Flutter

    通过context获取当前主题颜色   Theme.of(context).accentColor

  8. Kafka 通过python简单的生产消费实现

    使用CentOS6.5.python3.6.kafkaScala 2.10  - kafka_2.10-0.8.2.2.tgz (asc, md5) 一.下载kafka 下载地址 https://ka ...

  9. Greenplum 激活standby 和恢复 master 原有角色

    当Greenplum segment的primary出现问题时,FTS会监测到,GP会自动激活mirror.但是对于GP的master节点,虽然有standby,但是GP并不会自动来完成master和 ...

  10. PHP获取POST数据的三种方式

    一.PHP获取POST数据的几种方法 方法1.最常见的方法是:$_POST['fieldname']; 说明:只能接收Content-Type: application/x-www-form-urle ...